我在这里读到了一些有关生成无重复随机序列的帖子(例如Create Random Number Sequence with No Repeats),并决定为自己的需要实现它。
实际上,这是一个应用一些非破坏性(可逆)操作与当前计数器的位来得到应该只出现一次的伪随机数的算法。由于这些操作是可逆的,不同的源数字将给出不同的结果数字。
至少有几种可能的操作,如交换两个位,反转一个位,循环移位。如果我们只使用上述操作,序列的质量不会很好,因为相邻的计数器将产生具有相似数量的零和一的结果。真正的改变游戏规则的是将一个位与另一个位异或。现在序列看起来好多了,但问题是:
谢谢
Max
实际上,这是一个应用一些非破坏性(可逆)操作与当前计数器的位来得到应该只出现一次的伪随机数的算法。由于这些操作是可逆的,不同的源数字将给出不同的结果数字。
至少有几种可能的操作,如交换两个位,反转一个位,循环移位。如果我们只使用上述操作,序列的质量不会很好,因为相邻的计数器将产生具有相似数量的零和一的结果。真正的改变游戏规则的是将一个位与另一个位异或。现在序列看起来好多了,但问题是:
- 是否存在足够的操作的最小子集(例如反转位+通过另一个位异或位),添加任何其他操作只会使算法更难读而没有额外的好处
- 如何大致猜测给定范围的操作数,以使序列足够好。例如,对于从0到31的数字,200个操作会产生视觉上良好的结果,但对于范围为0..199的200个操作,有时会产生接近数字的块。
- 是否有用于测试此类序列的算法或测试套件。我知道并曾经使用过可以测试一般随机序列的测试套件,但这是一个不同的问题,因此可能需要一些特殊的测试套件,或者至少需要将其转换回一般的随机世界
谢谢
Max