我在这里读了几篇关于生成不重复的随机序列的文章(例如创建不重复的随机数序列 https://stackoverflow.com/questions/693880/create-random-number-sequence-with-no-repeats)并决定根据我自己的需要来实现它
实际上,它是一种对当前计数器的位应用一些非破坏性(可逆)操作的算法,以获得仅出现一次的伪随机数。由于操作是可逆的,不同的源数将给出不同的结果数。
至少有几种可能的操作,例如交换两位、反转一位、循环移位。如果我们只使用提到的那些,序列的质量不会很好,因为附近的计数器将产生具有相似数量的 0 和 1 的结果。真正的游戏规则改变者是一点一点的异或。现在序列看起来好多了,但问题是:
- 是否有足够的最小操作子集(例如反转位+异或位另一位)并且添加任何其他操作只会使算法更难以阅读,同时不会带来额外的好处
- 我怎样才能大致猜测给定范围内的操作数量以使序列足够好。例如,对 0 到 31 之间的数字进行 200 次运算可提供视觉上良好的结果,但对 0..199 范围进行 200 次运算有时会给出接近数字的块。
- 是否有用于测试此类序列的算法或测试套件。我知道并使用过一次可以测试一般随机序列的套件,但这个是不同的,所以可能需要一些特殊的套件,或者至少需要一些转换回一般随机世界
更新:正如我在此处的评论中发布的那样,已经有一个像这样的生成器:AES Encryption,但不幸的是它只能用于 128 位范围。
Thanks
Max
Problem:
生成 1 到 N 之间的唯一随机整数列表。
解决方案:
- 生成N个随机数;高斯分布或均匀分布...
- 对它们进行排序;保存索引(即列表中每个值的位置)
- 排序的索引就是您的列表。
在Matlab中:
z = rand( [N 1] );
[dummy iz] = sort(z);
% iz 是您的列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)