存储一长串随机数的最佳方法是什么?

时间:2012-10-08 07:43:13

标签: algorithm list numbers

我正在寻找一种存储长列表(可能是数千个)随机数的算法,并有效地检索它们。通常,解决方案不应要求对数据进行任何排序,即数字在生成时存储,并且所需的存储空间应小于这些数字的数组/散列所需的存储空间。可以将新号码添加到列表中。

3 个答案:

答案 0 :(得分:2)

尝试实施pseudo-random generators中的任何一项。所有你需要的 - 只是存储初始种子(必须是随机的)。但是,当然 - 访问伪随机序列的任何元素将具有复杂度O(N)。它只是space-time tradeoff

答案 1 :(得分:1)

@Stemm非常清楚将种子存储到伪随机数生成器(prng)。还需要计算数字,以便您知道调用prng多少次来检索它们。

如果您无权访问种子或数字是随机的,那么您可能有另一种选择。如果你的数字是整数,不是很大,而且你知道没有重复,那么考虑将它们存储为位。因此,例如,如果您的最长值适合2字节int,则可以使用1位存储该值。一些例子:

0 = 1。

4 = 10000二进制或10十六进制。

10 = 10000000000二进制。

如果最大值是65535,这是可以容纳在16位无符号整数内的最大值,那么保存所有值的内存量可以计算为65536/8 = 8192字节。如果您使用的是Java,请查看java.util.BitSetjava.math.BigInteger类来帮助完成此操作。

答案 2 :(得分:0)

如果这些数字是真正随机的,或者即使它们来自一个你不知道种子的足够好的RNG,也不可能压缩它们。对于特定的压缩方案,您可能会很幸运并绘制一组可压缩的数字,但此类事件的概率总是非常小。

这来自计数参数(也就是pigeonhole参数),只有足够长度小于n的位串来编码每个长度为n的字符串。流行的压缩方案通过利用只有很小一部分输入字符串的事实来解决这个问题。这个小集(例如英文文本,可执行二进制文件等)然后可以在较短的字符串上完全编码。

完全随机的字符串没有这样的后门,因此无法进行有意义的压缩。