Algorithm 填充间隔的随机数生成器

Algorithm 填充间隔的随机数生成器,algorithm,language-agnostic,random,Algorithm,Language Agnostic,Random,如何实现一个随机数生成器,在给定的时间间隔内,随机生成该时间间隔内的所有数字,而不进行任何重复 它应该消耗尽可能少的时间和内存 刚刚发明的C-ruby-ish伪代码中的示例: interval = new Interval(0,9) rg = new RandomGenerator(interval); count = interval.Count // equals 10 count.times.do{ print rg.GetNext() + " " } 这应该输出如下内容: 1

如何实现一个随机数生成器,在给定的时间间隔内,随机生成该时间间隔内的所有数字,而不进行任何重复

它应该消耗尽可能少的时间和内存

刚刚发明的C-ruby-ish伪代码中的示例:

interval = new Interval(0,9)
rg = new RandomGenerator(interval);
count = interval.Count // equals 10
count.times.do{
    print rg.GetNext() + " "
}
这应该输出如下内容:

1 4 3 2 7 5 0 9 8 6 

用间隔填充数组,然后洗牌


洗牌N个元素数组的标准方法是在0和N-1之间选择一个随机数,比如R,然后用项[N]交换项[R]。然后从N中减去1,然后重复,直到达到N=1。

一个建议,但它需要大量内存:

生成器生成一个间隔内所有数字的列表,然后将其洗牌

获取间隔中的所有数字,将它们放入列表/数组 列表/数组 在列表/数组上循环
一种方法是在您的示例中生成一个有序列表0-9

然后使用随机函数从列表中选择一个项目。从原始列表中删除该项并将其添加到新列表的尾部

当原始列表为空时,该过程结束


输出新列表。

一个偶尔有用的替代洗牌方法的方法是使用一个可订阅的集合容器。在每一步中,选择一个随机数0一种非常有效的方法来洗牌一个数字数组,其中每个索引都是唯一的,它来自图像处理,在应用像素溶解等技术时使用

基本上,从一个有序的二维数组开始,然后移动列和行。这些置换很容易实现,你甚至可以有一个精确的方法,在n次置换后,在x,y产生结果值

在3x3网格上描述的基本技术:

1从有序列表开始,每个数字只能存在一次

0 1 2
3 4 5
6 7 8
2选择要洗牌的行/列,将其向前推进一步。在本例中,我将第二排的第一排移到右侧

0 1 2
5 3 4
6 7 8
3选择要洗牌的行/列。。。我把第二列的一列淹没了

0 7 2
5 1 4
6 3 8
4选。。。例如,第一行,左边一行

2 0 7
5 1 4
6 3 8

您可以随时重复这些步骤。你也可以在一维数组上进行这种转换。所以现在的结果是[2,0,7,5,1,4,6,3,8]

这是以前提过的。尝试使用。

您可以使用随机选择的参数,但它会生成完整的周期。您需要小心,因为随机数的质量可能很差,这取决于参数。

值得指出的是,您提到的标准随机数是Fisher-Yates-Durstenfeld算法:如何确保LCG覆盖区间内的所有数字?e、 g.维基百科示例xn+1=3*xn+1不…您的示例不符合条件3中的“是”,您是对的;我没想到在LCG中,一旦你重复一个数字,你就会重新开始序列。
0 7 2
5 1 4
6 3 8
2 0 7
5 1 4
6 3 8