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

h8h8
     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才不一样

4300 4 1
4个回答

walkor 打赏

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

  • 大饭米粒 2019-01-07

    在Linux系统中开启多进程会出现无法随机数,我也刚遇到了这个问题,在找解决方法,Windows中无此问题(应该是Windows无法多进程)

xiewen_kevin

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

  • 暂无评论
walkor 打赏

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

  • 暂无评论
大饭米粒

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

  • 暂无评论
年代过于久远,无法发表回答
×
🔝