读/ dev/urandom并生成随机整数

Tow*_*wer 0 php security math

我试图创建一个函数,从/ 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的值更可能出现.我该怎么做才能解决这个问题?

Nik*_*kiC 5

a)如果您不需要加密安全随机数,只需使用mt_rand.它可能足以满足您的需求.

b)如果你想坚持你的算法:做一些重新映射:return round($min + $sum / pow(256, $bytesNeeded) * ($max - $min)).

c)如你所见,这需要round.我认为这会导致分布不均匀(虽然我对此不确定).可能最好的方法是将随机数作为浮点数然后进行缩放.虽然我不知道你是怎么得到一个漂浮物的/dev/urandom.这就是为什么我坚持mt_randlcg_value.