关于多个进程无法产生随机数问题

function getNonceStr($length = 32)
{
$chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}

$consumer->onWorkerStart = function($consumer)
{
\Workerman\Lib\Timer::add(0.5, function() use ($consumer){
while(1)
{
echo getNonceStr();
}
});
};

有一推送项目要产生随机数,发现在多个进程的情况下,每一次产生随机数都是一样的,,只有$consumer->count = 1才不一样
已邀请:

walkor

赞同来自:

我这测试正常。可能和系统或者环境有关,还要看mt_rand的底层实现。
不过这个都和workerman无关,不是workerman的问题。

xiewen_kevin - PHP是艺术...

赞同来自:

老铁,问题找到了吗?我这也是这种情况,哈哈

walkor

赞同来自:

可能是在主进程调用了mt_rand导致的,
子进程在onWorkerStart里调用下mt_srand随机播种试下

大饭米粒

赞同来自:

找到了解决办法,如果是用rand()取随机数,在rand前先执行srand(),如果用mt_rand()取随机数,就先执行mt_srand(),这样可以保证在Linux下多进程取出的随机数不一直重复。
 
注:srand()或mt_srand()不要用参数,原因不解释

要回复问题请先登录注册