【发布时间】:2015-10-26 22:34:51
【问题描述】:
我需要创建介于 0 和 10,000,000 之间的随机整数,并且需要数百万个这样的数字。这些数字必须尽可能接近 CSPRNG,因为这应该(例如)有人能够阅读,因此 200 万个这样的数字中有 100 万个他们会发现计算剩余的 100 万个数字是不切实际的。
经过一些研究,我得出的结论是,使用我可用的工具,使用 /dev/urandom 的 (Unix/PHP) 将是我最好的选择。
我遇到了这个解决方案:
// equiv to rand, mt_rand
// returns int in *closed* interval [$min,$max]
function devurandom_rand($min = 0, $max = 0x7FFFFFFF) {
$diff = $max - $min;
if ($diff < 0 || $diff > 0x7FFFFFFF) {
throw new RuntimeException("Bad range");
}
$bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM);
if ($bytes === false || strlen($bytes) != 4) {
throw new RuntimeException("Unable to get 4 bytes");
}
$ary = unpack("Nint", $bytes);
$val = $ary['int'] & 0x7FFFFFFF; // 32-bit safe
$fp = (float) $val / 2147483647.0; // convert to [0,1]
return round($fp * $diff) + $min;
}
来源:https://codeascraft.com/2012/07/19/better-random-numbers-in-php-using-devurandom/
鉴于我需要创建大量随机数,我是否最好将 /dev/urandom 管道传输到文件,然后一次读取 3 个字节(2^24 = 1600 万)并转换转整数?
这两种解决方案都适合我的需求吗?
【问题讨论】: