【发布时间】:2009-12-21 11:12:35
【问题描述】:
我正在从 /dev/urandom 读取随机字节,并且我想从它/它们中随机浮动。我该怎么做?我可以用 ord() 将字节转换为数字,它在 0 到 255 之间。
很明显,255 是 1.0,127 是 0.5,0 是 0.0,但我如何计算其余部分?另外,我认为一个字节不足以提供很多精度?我应该为此使用多少字节?
【问题讨论】:
标签: php random floating-point byte
我正在从 /dev/urandom 读取随机字节,并且我想从它/它们中随机浮动。我该怎么做?我可以用 ord() 将字节转换为数字,它在 0 到 255 之间。
很明显,255 是 1.0,127 是 0.5,0 是 0.0,但我如何计算其余部分?另外,我认为一个字节不足以提供很多精度?我应该为此使用多少字节?
【问题讨论】:
标签: php random floating-point byte
试试简单的线性关系
$f = $r / 255.0;
其中 $r 是随机字节,$f 是随机浮点数。
这样,当 $r=255 时,$f 为 1.0,当 $r=127 时,$f 为 0.498
对于 r=127 获得 0.5 需要不同的关系。
【讨论】:
嗯,你只是想要一个随机的数字序列吗?如果是这样,只需使用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;
【讨论】:
既然你希望 127 是 0.5,我想你想要
$float = round($byte/255,1)
【讨论】:
如果您想要float 可以提供的完整精度,那么您需要 24 位或三个字节:
$float = ($b1 | ($b2 << 8) | ($b3 << 16)) / (float)(1 << 24);
但是,PHP 的文档在细节上有点模糊,所以如果您需要一个 64 位长的 double 而不是 float 的 32 位,那么您将需要 53 位。
【讨论】: