我正在尝试创建一个从/ dev / urandom中获取的字节中生成随机整数的函数。我在PHP中这样做,目前看起来像:
public static function getRandomInteger($min, $max)
{
// First we need to determine how many bytes we need to construct $min-$max range.
$difference = $max-$min;
$bytesNeeded = ceil($difference/256);
$randomBytes = self::getRandomBytes($bytesNeeded);
// Let's sum up all bytes.
$sum = 0;
for ($a = 0; $a < $bytesNeeded; $a++)
$sum += ord($randomBytes[$a]);
// Make sure we don't push the limits.
$sum = $sum % ($difference);
return $sum + $min;
}
一切都很有效,除了我认为它没有完全公平地计算价值。例如,如果你想要一个0到250之间的随机值,它会收到一个字节并用250修改它,所以0-6的值比7-250的值更可能出现。我该怎么做才能解决这个问题?
答案 0 :(得分:5)
a)如果您不需要加密安全随机数,只需使用mt_rand
即可。它可能足以满足您的需求。
b)如果你想坚持你的算法:做一些重新映射:return round($min + $sum / pow(256, $bytesNeeded) * ($max - $min))
。
c)如您所见,这需要round
。我认为这会导致分布不均匀(虽然我对此不确定)。可能最好的方法是将随机数作为浮点数然后进行缩放。虽然我不知道你是如何从/dev/urandom
获得一个浮动的。这就是为什么我坚持使用mt_rand
和lcg_value
。
答案 1 :(得分:-1)
我会从/ dev / urandom $difference
读取mod $difference
个字节,然后添加$min
然后确保$max
不高于该数字。