Чтение / dev / urandom и генерация случайного целого числа - PullRequest
0 голосов
/ 14 ноября 2010

Я пытаюсь создать функцию, которая генерирует случайное целое число из байтов, которые я получаю из / 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 ]

5 голосов
/ 14 ноября 2010

а) Если вам не нужны криптографически безопасные случайные числа, просто используйте mt_rand.Вероятно, этого будет достаточно для ваших нужд.

b) Если вы хотите придерживаться своего алгоритма: Сделайте переопределение: return round($min + $sum / pow(256, $bytesNeeded) * ($max - $min)).

c) Как видите, для этого требуется round ING.Я думаю, это приведет к неравномерному распределению (хотя я не уверен в этом).Вероятно, лучший способ - получить случайное число в виде числа с плавающей запятой и затем масштабировать его.Хотя я понятия не имею, как вы получаете поплавок от /dev/urandom.Вот почему я придерживаюсь mt_rand и lcg_value.

0 голосов
/ 14 ноября 2010

Я бы прочитал $difference байт из / dev / urandom mod $difference, а затем добавил $min

Затем убедитесь, что $max не больше этого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...