Преобразование случайного байта (0-255) в число с плавающей точкой в ​​PHP? - PullRequest
0 голосов
/ 21 декабря 2009

Я читаю случайные байты из / dev / urandom и хочу сделать из них / их случайное число с плавающей точкой. Как бы я это сделал? Я могу преобразовать байт в число с помощью ord (), и это между 0 и 255.

Очевидно, что 255 - это 1,0, 127 - это 0,5, а 0 - это 0,0, но как мне рассчитать остальное? Кроме того, я думаю, что одного байта недостаточно, чтобы дать большую точность? Сколько байтов я должен использовать для этого?

Ответы [ 4 ]

2 голосов
/ 21 декабря 2009

Хм, вы просто хотите случайную последовательность чисел? Если это так, просто используйте http://php.net/mt_rand

$int = mt_rand(0, 1000);
$float = mt_rand(0, 1000) / 1000.0;
$float_more_precise = mt_rand(0, 100000) / 100000.0;
2 голосов
/ 21 декабря 2009

Попробуйте простые линейные отношения

$f = $r / 255.0;

, где $ r - это случайный байт, а $ f - случайное число с плавающей запятой.

Таким образом, когда $ r = 255, $ f равно 1,0 и , когда $ r = 127, $ f равно 0,498

, чтобы получить 0,5 для r = 127, потребуются другие отношения.

0 голосов
/ 21 декабря 2009

Если вам нужна полная точность, которую может предложить float, вам понадобятся 24 бита или три байта:

$float = ($b1 | ($b2 << 8) | ($b3 << 16)) / (float)(1 << 24);

Тем не менее, документация PHP немного неясна в деталях, поэтому если вам нужен double длиной 64 бита вместо 32-битного float, тогда вам потребуется 53 бита.

0 голосов
/ 21 декабря 2009

Так как вы хотите, чтобы 127 было 0,5, я думаю, вы хотите

$float = round($byte/255,1)
...