【发布时间】:2012-12-18 19:13:03
【问题描述】:
【问题讨论】:
-
PHP Manual for
mt_getrandmax中有一个官方的例子可以做到这一点 -
我的错,看了一眼,但没有遇到那个问题
-
为什么不让它变得简单。 rand(0,1).".".rand(0,100)
标签: php random floating-point integer
【问题讨论】:
mt_getrandmax中有一个官方的例子可以做到这一点
标签: php random floating-point integer
mt_rand() / mt_getrandmax();
避免使用rand() 函数,因为它通常依赖于平台的C rand() 实现,通常以非常简单的模式创建数字。见this comment on php.net
更新:在 php 7.1 中,rand()has been changed 现在只是 mt_rand() 的别名。因此现在也可以使用rand()。
【讨论】:
mt_rand(0, mt_getrandmax() - 1) / mt_getrandmax()
rand 使用与 mt_rand 相同的生成器。但是,当max 小于min 时,参数的值会有不同的行为。
$v = mt_rand() / mt_getrandmax();
会这样做的。
如果您只想要一位小数(如问题中的示例),只需 round() 您得到的值...
$v = round( $v, 1 );
...或计算 0 到 10 之间的数字并除以 10:
$v = mt_rand( 0, 10 ) / 10;
【讨论】:
根据 PHP 文档,如果您使用的是 PHP 7,则可以使用 random_int 生成加密安全的伪随机整数
话虽如此,这里有一个函数利用它在两个数字之间生成随机浮点数:
function random_float($min, $max) {
return random_int($min, $max - 1) + (random_int(0, PHP_INT_MAX - 1) / PHP_INT_MAX );
}
虽然 random_int() 比 mt_rand() 更安全,但请记住它也更慢。
此答案的先前版本建议您使用 PHP rand(),但实现很糟糕。我想改变我的答案,而不重复其他人已经说过的话,现在我们来了。
【讨论】:
试试这个
// Generates and prints 100 random number between 0.0 and 1.0
$max = 1.0;
$min = 0.0;
for ($i = 0; $i < 100; ++$i)
{
print ("<br>");
$range = $max - $min;
$num = $min + $range * (mt_rand() / mt_getrandmax());
$num = round($num, 2);
print ((float) $num);
}
【讨论】:
转换为浮点数*并除以getrandmax()。
【讨论】:
这个简单的解决方案怎么样:
abs(1-mt_rand()/mt_rand())
或
/**
* Generate Float Random Number
*
* @param float $Min Minimal value
* @param float $Max Maximal value
* @param int $round The optional number of decimal digits to round to. default 0 means not round
* @return float Random float value
*/
function float_rand($Min, $Max, $round=0){
//validate input
if ($min>$Max) { $min=$Max; $max=$Min; }
else { $min=$Min; $max=$Max; }
$randomfloat = $min + mt_rand() / mt_getrandmax() * ($max - $min);
if($round>0)
$randomfloat = round($randomfloat,$round);
return $randomfloat;
}
【讨论】:
$Min < $Max——交换它们会产生数学上相同的概率分布……
简单地除以 10 怎么样?
$randomFloat = rand(0, 10) / 10;
var_dump($randomFloat);
//eg. float(0.7)
【讨论】:
rand(0, 10000) / 10000) 以产生更多小数,从而产生更多随机性。