Random 非重复PRNG算法

Random 非重复PRNG算法,random,mapping,Random,Mapping,以下算法生成一个非重复随机数数组(该示例用Fortran 95编写): 程序测试 隐式无 实数::x 整数::i,aux 整数,维度(100)::y=0 i=2100吗 随机呼叫号码(x) aux=int(3*x)+1!随机数:1、2或3 aux=aux+y(i-1)!添加以前选择的号码 y(i)=模(辅助,4)!mod 4给出了最终结果:0、1、2或3 打印*,y(i) 结束循环 结束程序测试 在另一个讨论论坛上,一位成员提出了该算法,以解决如何使用常规随机数生成器和每个循环固定数量的操作来

以下算法生成一个非重复随机数数组(该示例用Fortran 95编写):

程序测试
隐式无
实数::x
整数::i,aux
整数,维度(100)::y=0
i=2100吗
随机呼叫号码(x)
aux=int(3*x)+1!随机数:1、2或3
aux=aux+y(i-1)!添加以前选择的号码
y(i)=模(辅助,4)!mod 4给出了最终结果:0、1、2或3
打印*,y(i)
结束循环
结束程序测试
在另一个讨论论坛上,一位成员提出了该算法,以解决如何使用常规随机数生成器和每个循环固定数量的操作来输出非重复数的难题(例如,当随机值与前面相同时,循环不会给每个循环提供恒定数量的操作)

他的算法似乎工作得很好,结果是均匀分布的,在输出中的任何子字符串中都没有明显的模式(我搜索了大小为2到5的子字符串,所有的行为都如预期的那样)。但在这个解决方案中让我困惑的是,随机数生成器只输出三个可能的数字(0、1或2),而整个算法输出四个可能的结果(0、1、2或3)。这怎么可能?我认为可以绘制PRNG的结果,但不能绘制它(例如,如果PRNG生成的数字介于0和7之间,则可以将其映射为0-3=>0和4-7=>1,但仅生成0和1的PRNG无法在同一循环中生成介于0-7之间的结果–因为显然可以将三个结果分组,以便映射000=>0,001=>1,…111=>7)


编辑:这是相同的算法,但是用伪代码编写的,因为这个问题与Fortran或任何编程语言都不相关

x ← 0
do
  aux ← random number between 1 and 3
  aux ← aux + x
  x ← aux MOD 4
  print x
enddo

嗯,我可能遗漏了什么,因为我记不太清楚Fortran

为什么在i=1时允许访问y(i-1)。这不是数组边界冲突吗?我假设它只返回零或其他值

假设y(i-1)=0,并且y(1)将是相同的(1、2或3)。那么第二次通过时,aux将是(1、2或3)+(1、2或3),它将是2、3、4、5或6,y(2)将是0、1、2或3,因为4模4=0,5模4=1。从那时起,y(n)可以是0、1、2或3,因为您将始终向(0、1、2或3)添加(1、2或3)并按4进行修改

我感觉你在做一个我没有做的假设,我不知道什么样的有效假设会将输出限制为仅3个值


随机数函数一眼就分配
0,上述算法似乎将
0
2
之间的随机整数(即3个值)作为输入,并输出
0
3
之间的随机整数(即4个值)对于每个周期,由于上采样,这似乎是有问题的。但实际上,算法总是只在3个选项中进行选择,因为每个值不能与前一个值相同。例如,如果选择的第一个随机整数是
0
,则下一个整数有三个可能的值(
1
2
3
),这正是范围PRGN所提供的。因此,关键是要认识到3个随机值被映射为4个非重复随机值,这可以在不产生任何不需要的模式的情况下完成


因此,对于从
0
N
的随机输入,使用
MOD N+1
是没有问题的,因为信息量不会随之改变。但是当我们使用
MOD N+2
或更大时,如果输出是真正随机的,我们实际上观察到了不应该存在的模式两个连续数字的结果永远不会出现:例如,取
N=3
(即
0
2
之间的输入)和
MOD 5
,将永远不会看到
0
后面跟着
4
,因为没有输入使得表达式
((输入+1)+0)MOD 5=4
是正确的。

关于您的替代算法,我建议您可以在达到100个样本之前,通过添加一个二进制值,如01100,使随机性偏差变得可以忽略不计(精确值仅用于可视化)它在每次迭代中向右旋转,到一个二进制值,比如10110,它在每次迭代中切换位,到一个二进制值,比如11001,它在每次迭代中向左旋转。然后你可以添加反馈,比如y(i-1)和y(i-5),可能是系数,然后是MOD。我认为伪对称性和复杂性应该使分布均匀。你可能需要一个种子值,基于时间或温度(以开尔文为单位)乘以甲骨文股票易手的股数YTD,至少最初是这样,可能也会撒在算法中。我可能没有做过我不清楚你的随机0或1值是否会包含在每次迭代中。我是否对这个虚构的算法太过火了,而你想要的只是对一个不太复杂的算法进行一次向上或向下的投票?我给出了一个例子,如果我们有一个随机整数生成器输出0和1,那么映射这个结果是不可能的如果这是正确的,那么我想知道为什么将介于0和2之间的值映射为介于0和3之间的值是有效的。如果我之前写的不正确,那么我想知道这是如何工作的,如何生成更多的“信息”“错误”是一个糟糕的词语选择,因为它在计算机科学和统计学中的意思完全不同。我只是指“偏离统计随机性”,意思是“统计错误”或“干扰”。我想我明白了