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

时间:2010-11-14 15:20:07

标签: 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;
    }

一切都很有效,除了我认为它没有完全公平地计算价值。例如,如果你想要一个0到250之间的随机值,它会收到一个字节并用250修改它,所以0-6的值比7-250的值更可能出现。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:-1)

我会从/ dev / urandom $difference读取mod $difference个字节,然后添加$min

然后确保$max不高于该数字。