У меня есть проект, который использует mt_rand () php для генерации различных случайных целых чисел, но я недавно получил доступ к потоку реальных случайных бит. Мне трудно понять, как создать функцию, похожую на mt_rand (), где я могу получить случайное целое число между двумя значениями из моего потока бит. Как я могу это достичь?
Я бы просто прочитал PHP_INT_SIZE * 8
бит и PHP_INT_SIZE * 8
итоговое число в PHP_INT_SIZE * 8
вам диапазоне:
function squash($nr, $min, $max) { return $min + $nr % ($max - $min); }
Другой путь:
function squash($nr, $min, $max) { return $min + round($nr / PHP_INT_MAX * ($max - $min)); }
Мне это только пришло в голову, почему бы просто не использовать ваш случайный поток и нажать его в mt_srand()
:
function squash($nr, $min, $max) { mt_srand($nr); return mt_rand($min, $max); }
Я придумал метод, но не уверен, что его наиболее эффективный способ использования битов (код не проверен, просто демонстрирует теорию):
function RandomInteger($min, $max) { $range = ($max - $min) + 1; $bitsNeeded = ceil( log($range, 2) ); $number = ReadBitsAndConvertToInteger($bitsNeeded); if ($number < $range) return $number + $min; else if ($number > $range) return RandomInteger($min, $max); }
Как вы можете видеть, будет вероятность повторения функции, что означает, что будет использоваться больше бит, поэтому я не уверен, что это самый эффективный способ использования битов.
Pr(repeat) = (2^bitsNeeded - range) / (2^bitsNeeded)
Therefore, 0 < Pr(repeat) < 0.5
Поэтому в худшем случае вероятность повторения – почти 0,5, начинает маловероятно, что его нужно будет повторить более 10 или около того, при этом среднее значение будет меньше двух раз. Очевидно, что при меньших возможностях повторения эти цифры становятся ниже.