Получить отрицательные числа с OpenSSL Random In PHP

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