Random 随机映射数

Random 随机映射数,random,mapping,Random,Mapping,有没有一种方法可以以随机顺序迭代一组大的连续数字(比如0到10^9),同时确保我最终遇到了它们中的每一个?假设这些数字足够大,因此洗牌数组是不可行的: a = range(10**9); random.shuffle(a); # :( 我想如果没有某种完美的散列算法(零冲突?),这是不可能的 因此,让我补充一点,作为缓解情况,我不需要映射到真正的“真正”随机。它必须有一个很好的“传播”。这里有一个关于使用Fisher-Yates洗牌算法洗牌的wiki页面 好吧,如果你使用的是Java。。就

有没有一种方法可以以随机顺序迭代一组大的连续数字(比如0到10^9),同时确保我最终遇到了它们中的每一个?假设这些数字足够大,因此洗牌数组是不可行的:

 a = range(10**9); random.shuffle(a); # :(
我想如果没有某种完美的散列算法(零冲突?),这是不可能的


因此,让我补充一点,作为缓解情况,我不需要映射到真正的“真正”随机。它必须有一个很好的“传播”。

这里有一个关于使用Fisher-Yates洗牌算法洗牌的wiki页面

好吧,如果你使用的是Java。。就这么简单

如果不是,我建议看一下:

如果这不起作用


创建一个自定义的,其模数是您希望迭代的范围。如果您符合赫尔-多贝尔定理的三个要求(在链接的维基百科文章的“周期长度”部分中指定),那么生成器将在循环之前遍历每个值。若要终止,请检查当前迭代生成的值是否与初始值相等。

实际上,我不想只洗牌数组。也许我应该说得更清楚些。我想以随机顺序遍历这些数字,而不把全部内容都记在内存中。哦,我明白你想要什么。。我不知道该说实话。我会看看我是否能想出一些东西,虽然我希望有人能给我指出一些理论上有根据的东西:)。让我查一查。LCG的理论基础很好。不确定你反对的是什么,一个定理证明了结果会在重复之前通过每一个可能的值……是的,我想你错了。我想说的是:“我希望你的回答,谢谢!”如果
m
有很多因素,那么查找
a
可能是一个真正的PITA。如果
m
是素数,生活就会容易得多。使用
a=1
c=1
总是有效的,但显然不是您想要的;)另外:取你范围上的第一个素数作为模数。因此,您可以更容易地找到好的参数。在枚举过程中,只需删除超出范围的所有数字。由于素数非常接近,“开销”是可以忽略的。