PHP应用能否实例化多个RNG?(适配PHP < 8.2版本)
关于PHP中自行实例化MT19937随机数生成器的问题
更新说明:本问题适用于PHP < 8.2版本;PHP 8.2及以上版本可直接使用Randomizer类
PHP内置的mt_rand()和mt_srand()是全局静态的随机数生成方法,从PHP源码中能看到mt_rand底层依赖engine_mt19937实例,但在PHP < 8.2版本中,无法直接在PHP代码层面实例化engine_mt19937——这个类属于PHP扩展的内部实现细节,并没有对外暴露用户态的调用接口。
如果需要在PHP < 8.2版本中获得独立可控的MT19937随机数生成实例,有两种可行方案:
- 自行用PHP代码实现MT19937算法:完全重写该随机数生成器的逻辑,从而完全掌控种子设置和随机数生成过程,不受全局状态干扰。
- 使用第三方PHP库:部分专注于随机数处理的第三方库提供了独立的MT19937实现,可直接引入使用。
在PHP 8.2及以上版本中,官方已经提供了标准化的解决方案:通过Randomizer类搭配Random\Engine\Mt19937引擎,就能轻松创建独立的、可自定义种子的随机数生成实例,示例代码如下:
// 创建指定种子的MT19937引擎实例 $engine = new Random\Engine\Mt19937(12345); // 基于该引擎构建Randomizer $randomizer = new Random\Randomizer($engine); // 生成指定范围的随机整数 echo $randomizer->getInt(1, 100);
内容的提问来源于stack exchange,提问作者Jon Bates
相关产品推荐
相关产品推荐

