【问题标题】:PHP - Pseudo Random Number Generator?PHP - 伪随机数生成器?
【发布时间】:2014-05-18 12:31:30
【问题描述】:

在过去的几天里,我一直在尝试找到一种在 PHP 中基于种子生成随机数的好方法。就像我相信你们中的大多数人已经知道一样,php rand() 方法在某些情况下过于随机,我真的需要一个 PRNG,它可以让我根据种子一遍又一遍地生成相同的序列号。

我已经尝试过使用 XORShift PRNG,但由于 PHP 处理位移的方式,不同的操作系统似乎会生成不同的答案。

我需要某种可以很好地与 PHP 配合使用的算法,它能够生成非常大的数字,因为无论如何我都会在它前面放一个零并将它变成一个小的双精度数。 (0.兰德)

【问题讨论】:

  • 您正在寻找一种随机数生成器,它能够以可预测的方式一遍又一遍地生成相同的数字?有趣的。我建议您创建一次序列,并在每次再次需要该序列时存储并重复使用它。
  • 不幸的是,这行不通,因为每当新用户创建帐户时,我都需要它来生成太阳能系统。为简单起见,我想将种子存储在数据库中,然后能够使用某种形式的 PRNG 在屏幕上渲染依赖于该种子的所有内容。
  • @arkascha 是的,这是 pseudo 随机数生成器的一个非常典型的用法。 @user mt_srand + mt_rand 不起作用...? 3v4l.org/AMWtr
  • @arkascha 别是个聪明人
  • 据我了解它们的工作方式是您设置“mt_srand”或“srand”,并且在调用“mt_rand”时它总是会为您生成相同的号码或“兰特”。

标签: php random numbers prng


【解决方案1】:
mt_srand(42);

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

这会在我的系统上生成序列 64、80、96。每次执行此代码时都会这样做。您使用您的特定数字(此处为 42)为生成器播种一次,然后一次又一次地调用生成器以生成随机数。


随机数生成器(真正不可预测的随机性)无法播种并产生真正不可预测的随机数。计算机通常无法做到这一点,因为随机性正是它们不所做的。计算机是确定性的,不能产生真正的随机性。你需要做一些事情,比如测量放射性衰变来产生真正的随机性。

Pseudo 随机数生成器表面上看起来是随机的,但实际上并非如此。他们从一个数字开始,然后对该数字应用确定性数学运算来改变它并产生一个不同的数字。每次调用生成器时,它都会根据最后一个数字生成一个新数字。因此,PRNG 的顺序总是相同的。好的 PRNG 以这样一种方式应用操作,即序列看起来非常随机分布。通常,它们会以一天中的时间之类的方式播种,因此如果您没有明确播种它们,它们出现是随机的。但是,如果您使用特定值播种它们,它们将产生固定的预定数字序列。

【讨论】:

  • 更新了一些解释。
  • 只是为了记录,我大概完全不同的系统上的 64、80,96 和一个好年头,大概以后还有 php 版本(所以没有(在这种情况下)令人不安的“盐”实施,似乎)。
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多