Я возился с некоторым кодом, чтобы создать мощный генератор псевдослучайных чисел с использованием PHP. Пока у меня есть следующее.
function strongRand($bytes, $min, $max) { if(function_exists('openssl_random_pseudo_bytes')) { $strong = true; $n = 0; do{ $n = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes, $strong))); } while($n < $min || $n > $max); return $n; } else{ return mt_rand($min, $max); } }
Это почти идеально для меня, за исключением того, что все числа, которые я генерирую с помощью openssl_random_pseudo_bytes
являются положительными. В идеале я хотел бы генерировать числа от -x до + y. Я подумал о том, чтобы добавить еще один вызов PRNG, чтобы решить, должно ли число быть положительным или отрицательным, но я не уверен, что это лучший способ.
Вы можете просто добавить еще одну случайную функцию, мы будем использовать rand(0,1)
это сгенерирует 0 или 1, если это 1 $status = 1
если это 0 $status = -1
. Когда мы возвращаем значение, мы делаем умножение на $ status:
function strongRand($bytes, $min, $max) { $status = mt_rand(0,1) === 1 ? 1:-1; if(function_exists('openssl_random_pseudo_bytes')) { $strong = true; $n = 0; do{ $n = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes, $strong))); } while($n < $min || $n > $max); return $n * $status; } else{ return mt_rand($min, $max) * $status; } }
Если вам нужно сгенерировать число от -x до + y, вы можете просто сгенерировать 4-байтовый uint и:
$number = ($generated % ($x + $y + 1)) - $x