一尘不染

创建无重复的随机数序列

algorithm

我想要一个伪随机数生成器,它可以生成没有随机顺序重复的数字。

例如:

随机的(10)

可能会返回5、9、1、4、2、8、3、7、6、10

除了确定数字范围并将其改组或检查生成的列表是否重复之外,还有其他更好的方法吗?


编辑:

我也希望它能在没有整个范围的情况下有效地生成大数字。


编辑:

我看到每个人都在建议改组算法。但是,如果我想生成较大的随机数(1024字节+),则与仅使用常规RNG并将其插入Set中直到达到指定的长度相比,该方法将占用更多的内存,对吗?对此没有更好的数学算法。


阅读 276

收藏
2020-07-28

共1个答案

一尘不染

您可能对线性反馈移位寄存器感兴趣。我们以前是用硬件来构建它们的,但是我也已经用软件来完成它们。它使用移位寄存器,将某些位进行异或并反馈给输入,如果您选择正确的“抽头”,则可以得到与寄存器大小一样长的序列。也就是说,一个16位的lfsr可以产生一个序列65535,没有重复。它在统计上是随机的,但当然可以重复。另外,如果做错了,您可以得到一些令人尴尬的简短序列。如果您查找lfsr,则会找到有关如何正确构造它们的示例(即“最大长度”)。

2020-07-28