有没有办法以随机顺序遍历一大组连续的数字(比如说 0 到 10^9),同时确保我最终遇到了每个数字?假设数字足够大,以至于洗牌数组是不可行的:
a = range(10**9); random.shuffle(a); # :(
我想如果没有某种完美的散列算法(零冲突?),这是不可能的。
因此,让我添加一个缓解情况,即我不需要映射实际上“真正”随机。它只需要有一个很好的“传播”。
创建一个自定义的线性同余生成器,其模数是您希望迭代的范围。如果您符合 Hull-Dobell 定理的三个要求(在链接的 Wikipedia 文章的“周期长度”部分中指定),您的生成器将在循环之前遍历每个值。要终止,请检查当前迭代的生成值是否与初始值相等。
Heres a wiki page on shuffling using the Fisher-Yates shuffling algorithm
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
Well, if you're using Java.. it is that easy.
http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html
if not, I'd suggest looking at this:
http://www.geeksforgeeks.org/shuffle-a-given-array/
and if THAT doesn't work...