我需要为人们生成用于访问我网站的伪随机代码。我写了一些代码来允许这个,但没有意识到我使用字符数组而不是整数作为种子(使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
挣扎。谢谢!!
答案 0 :(得分:3)
(归功于其他人已经指出了这个问题:你有一个32位和64位服务器。如果他发布的话,请回答他的答案)
这是你的问题:
处理big_ints的解决方案是使用GMP或BCMath库,但是在这种情况下这些不适用于mt_srand()需要一个整数 - 所以你只能限制在-2.1亿到+2.1亿之间的数字,或者在您的Web服务器上安装64位OS / Apache / PHP。