可重现的随机数系列

Sha*_*rky 11 php random

如何在PHP中获得一系列可重现的伪随机数?

在旧版本的PHP中,我可以通过在RNG中使用相同的种子来实现这一点,但它不再起作用,因为PHP改变了rand和mt_rand的工作方式.

请在PHP.net页面中看到此评论:

请记住,出于加密安全原因,默认安装在许多PHP安装(如Debian和DirectAdmin)上的Suhosin补丁会完全禁用srand和mt_srand函数.要在Suhosin强化服务器上​​从固定种子生成可重现的随机数,您需要包含自己的伪随机生成器代码.

该评论的链接:http://www.php.net/manual/en/function.srand.php#102636

有没有准备好的解决方案?我没有时间也没有经验来创建我自己的伪随机生成器代码.

我的目标是拥有一个代码

<?php
   //( pseudo random code here...)
   $the_seed = 123; // 123 is just a number for demo purposes, NOT a static number
                    //...i hope you get the idea. It's just a hardcoded seed,
                    // it could be a seed based on a user-id, a date etc...
                    // we need the same output for a given seed.
   //( pseudo random code here...)

   // ...and finally
   echo $the_random_number;
 ?>
Run Code Online (Sandbox Code Playgroud)

所以每当我访问这个页面时,我应该得到相同的号码.

Ada*_*vis 10

Mersenne Twist是一个很好的快速PRNG,这里是一个公共域PHP实现:

http://kingfisher.nfshost.com/sw/twister/

这仅适用于PHP 5.3.0及更高版本.

  • @McKay 问题的第二段回答了你的问题。简而言之,对于给定的输入,他需要相同的随机数序列 - 这通常是通过每次使用相同的种子播种随机数生成器来完成的。然而,PHP 的常见安全补丁消除了为随机数生成器提供种子的能力,因为太多人将其用于加密应用程序,但没有使用加密安全的种子源。 (2认同)

Cha*_*rns 7

Mersenne Twister是一些最好的随机数算法之一.你可以在这里找到一个纯PHP版本(还有其他版本).

然后你可以打电话:

init_with_integer($integer_seed)
Run Code Online (Sandbox Code Playgroud)

并且每次都获得相同的输出(对于给定的种子).