php应用程序可以示例化多个RNG吗

1tu0hz3e  于 2023-01-04  发布在  PHP
关注(0)|答案(2)|浏览(151)

更新-此问题适用于PHP〈8.2-对于8.2+,您可以访问Randomizer
PHP支持'mt_兰德()'和'mt_srand()',但它们是全局和静态的。
我注意到在PHP C源代码中mt_rand使用了一个engine_mt19937示例;在PHP中是否有一种方法可以示例化我们自己RNG示例,以便我们可以控制它的种子?

bgibtngc

bgibtngc1#

在PHP中是否有一种方法可以示例化我们自己RNG示例,以便我们可以控制它的种子?
对于PHP 8.2+,是的。参见\Random类。您可以执行以下操作:

$rand1 = new \Random\Engine\Mt19937($seed1);
$value1 = $rand1->generate();

$rand2 = new \Random\Engine\Mt19937($seed2);
$value2 = $rand2->generate();
dldeef67

dldeef672#

在PHP8.2+上,可以。请看@AlexHowansky的回答。在早期的PHP版本上,不行。
源代码链接指向master分支,自上个月正式发布以来,该分支已经包含了PHP 8.2逻辑,这就是master分支包含MT 19937引擎引用的原因。
在旧版本(例如最新的8.1分支)中,您可以看到mt_rand()没有使用可配置的引擎,而只是检查它是否已经被播种。PHP 8.1和更早的版本为mt_rand()使用单个全局生成器,因此如果您想使用本机函数,不可能有多个具有不同种子的RNG。
话虽如此,您也许可以推出自己的MT 19937 RNG for PHP 8.1.Others have实现。

相关问题