mt_rand使用一个字符作为种子

时间:2012-09-14 01:37:11

标签: php random mt

我需要为人们生成用于访问我网站的伪随机代码。我写了一些代码来允许这个,但没有意识到我使用字符数组而不是整数作为种子(使mt_rand可重复)。我的演示代码在这里:

$seedVal = array(6565866669, 6565866670, 6565866671);


foreach ($seedVal as $seed) {
    mt_srand($seed);
    $rnd = '';
    for ($i = 0; $i < 11; $i++) { // Loop over the string length
        $tmp = mt_rand(0, 10);
        $rnd .= $tmp;
    }

    echo "Seed = $seed, RandNum = $rnd </br>";
}

echo "</br>Now with character seeds</br>";

$seedVal = array('6565866669', '6565866670', '6565866671');

foreach ($seedVal as $seed) {
    mt_srand($seed);
    $rnd = '';
    for ($i = 0; $i < 11; $i++) { // Loop over the string length
        $tmp = mt_rand(0, 10);
        $rnd .= $tmp;
    }

    echo "Seed = $seed, RandNum = $rnd </br>";
}

return;

1and1的结果是:

Seed = 6565866669, RandNum = 425453109319 
Seed = 6565866670, RandNum = 39388593858 
Seed = 6565866671, RandNum = 891273965110 

Now with character seeds
Seed = 6565866669, RandNum = 97138956767 
Seed = 6565866670, RandNum = 97138956767 
Seed = 6565866671, RandNum = 97138956767 

但在其他地方,结果(localhost,其他服务器等)是:

Seed = 6565866669, RandNum = 425453109319
Seed = 6565866670, RandNum = 39388593858
Seed = 6565866671, RandNum = 891273965110

Now with character seeds
Seed = 6565866669, RandNum = 425453109319
Seed = 6565866670, RandNum = 39388593858
Seed = 6565866671, RandNum = 891273965110 

问题是在我现在的服务器(1和1)上系统工作正常(使用不可预测的字符输入)。但我正在迁移到新的服务器,当然,代码看起来像第一套ALWAYS。换句话说,我不知道如何生成第二组随机数(用字符数组播种)。

谁能告诉我怎么做?

我想:

mt_srand('6565866669');
echo mt_rand(0, 10);

返回

97138956767

挣扎。谢谢!!

1 个答案:

答案 0 :(得分:3)

(归功于其他人已经指出了这个问题:你有一个32位和64位服务器。如果他发布的话,请回答他的答案)

这是你的问题:

  1. mt_srand()采用整数参数
  2. 当参数
  3. 需要时,PHP将(有帮助)尝试将字符串转换为整数
  4. 64位系统上的最大整数是4.something gazillion - 所以你的字符串将转换为整数,但在32位系统上,最大整数是21亿,所以你的字符串将转换为具有允许范围的不同整数(它达到21亿,然后包装到-2.1亿并计算并重复)。
  5. 处理big_ints的解决方案是使用GMP或BCMath库,但是在这种情况下这些不适用于mt_srand()需要一个整数 - 所以你只能限制在-2.1亿到+2.1亿之间的数字,或者在您的Web服务器上安装64位OS / Apache / PHP。