【发布时间】:2014-05-08 20:53:53
【问题描述】:
我有一组正好 16,704,200 个独特的对象。我需要构造一个函数f,这样:
f(x)从列表中返回一个看似随机的对象(但对于给定的x值,总是相同的对象)f(0)到f(16704199)以看似随机的顺序返回完整的对象集(无重复)f不需要存储 16,704,200 个有序整数的列表
我查看了几个关于使用伪随机数生成器或线性反馈移位寄存器生成随机数序列的 SO 答案。缺点是找到f(7000) 的值的唯一方法是初始化寄存器,循环7000 次,然后返回数字。 (除非我存储了整个预先生成的序列,如上所述,我不想这样做。)
有没有更适合在随机序列中查找第 7000 个 (xth) 条目的算法?
【问题讨论】:
-
本质上,您正在寻找自身的 可逆 映射 (0..16_704_199),其中关系是“随机的”。显然,真正的随机已经过时了,如果您不想存储或迭代,大多数 PRNG 都会过时。您也许可以构建一个可逆映射,但随机性可能很简单或很弱 - 这可以接受吗?
-
@NeilSlater 是的,在我的情况下,弱随机性是完全可以的,只要
f的任何给定序列 - 比如说,任何给定的 100 个连续x的集合 - 分布有点均匀整个列表。 -
您也许可以使用“老派”RNG 构建一些东西:en.wikipedia.org/wiki/Linear_congruential_generator - 另见stackoverflow.com/questions/2911432/…
-
不知道有没有这样的算法满足第2点和第3点,如果原始集合中对象的顺序不能改变。
标签: ruby