PHP - 伪随机数生成器?

6
在过去的几天里,我一直在尝试找到一种好的方法来基于种子在PHP中生成随机数。就像大多数人已经知道的那样,php rand() 方法对于某些情况来说过于随机,我真的需要一个PRNG,它可以让我基于一个种子反复生成相同的序列数字。
我已经尝试使用XORShift PRNG,但问题在于不同的操作系统似乎会因为PHP处理位移的方式而生成不同的答案。
我需要一种在PHP中能够很好地工作的算法,能够生成相当大的数字,因为无论如何我都会在它前面放一个零,并将其转换为小数。(0.RAND)

2
你正在寻找一个可以以可预测的方式一遍又一遍地生成相同数字的随机数生成器?有趣。我建议你创建一个序列,每次需要使用该序列时存储并重复使用它。 - arkascha
1
@arkascha不要聪明到讨厌的地步。 - Ben
@user 对,这对你不起作用吗? - deceze
我需要一系列的随机数。 - user3490600
如果您需要一个序列,则在种子后多次调用rand()或mt_rand()。 - Mark Baker
显示剩余4条评论
1个回答

8
mt_srand(42);

echo mt_rand(1, 100);
echo mt_rand(1, 100);
echo mt_rand(1, 100);

在我的系统上,这将生成序列64、80、96。每次执行此代码时都会如此。你用你的特定数字(这里是42)一次性地初始化生成器,然后再次调用生成器来产生随机数。


真正不可预测的随机数生成器无法被初始化并产生真正不可预测的随机数。计算机通常不能做到这一点,因为随机性恰恰是它们所不能做到的。计算机是确定性的,无法产生真正的随机性。你需要做一些像测量放射性衰变之类的事情来产生真正的随机性。

随机数生成器表面上看起来行为随机,但实际上不是。它们从一个数字开始,然后应用确定性的数学运算来改变它并产生不同的数字。每次调用生成器时,它都将基于其上一个数字产生一个新数字。因此,PRNG的序列始终相同。好的PRNG以这样的方式应用操作,使得序列看起来非常随机分布。通常它们会被初始化为一些像当天时间之类的东西,因此如果你没有显式地初始化它们,它们就会看起来随机。但如果你用特定的值初始化它们,它们就会产生一系列固定的预定数字。


更新了一些解释。 - deceze
仅供记录,我的系统完全不同,是64、80、96,而且经过了很好的一年和可能更高版本的PHP,所以在实现中似乎没有任何干扰性的“盐”。 - Frank N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接