我试图创建一个函数,从/ 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;
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,除了我认为它没有完全公平地计算价值.例如,如果你想要一个0到250之间的随机值,它会收到一个字节并用250修改它,所以0-6的值比7-250的值更可能出现.我该怎么做才能解决这个问题?
a)如果您不需要加密安全随机数,只需使用mt_rand
.它可能足以满足您的需求.
b)如果你想坚持你的算法:做一些重新映射:return round($min + $sum / pow(256, $bytesNeeded) * ($max - $min))
.
c)如你所见,这需要round
.我认为这会导致分布不均匀(虽然我对此不确定).可能最好的方法是将随机数作为浮点数然后进行缩放.虽然我不知道你是怎么得到一个漂浮物的/dev/urandom
.这就是为什么我坚持mt_rand
和lcg_value
.
归档时间: |
|
查看次数: |
1286 次 |
最近记录: |