随机浮点数介于0到1.0之间

Mat*_*ood 46 php random floating-point integer

可能重复:
php中的Random Float

是否有可能创建一个介于0和1.0之间的随机浮点数,例如0.4,0.8等.我使用rand但它只接受整数.

Fra*_*ois 95

mt_rand() / mt_getrandmax();
Run Code Online (Sandbox Code Playgroud)

避免使用该rand()函数,因为它通常取决于平台的C rand()实现,通常使用非常简单的模式创建数字.在php.net上看到这条评论

  • 或者,为了更恰当地模拟我认为是标准随机化例程的0.0包含到1.0的排他性,使用`mt_rand(0,mt_getrandmax() - 1)/ mt_getrandmax()` (22认同)
  • 在 PHP 7.0 `rand` 中使用与 `mt_rand` 相同的生成器。但是,当 `max` 小于 `min` 时,参数值会有不同的行为。 (2认同)

h2o*_*ooo 25

简单地除以10怎么样?

$randomFloat = rand(0, 10) / 10;
var_dump($randomFloat);

//eg. float(0.7)
Run Code Online (Sandbox Code Playgroud)

  • @Dracony,h2oooooo:要迂腐,随机性的数量不会改变...... (7认同)
  • @Dracony OP似乎只想要1个小数.当然,任何数字都可以被选中(`rand(0,10000)/ 10000`)以产生更多的小数,从而产生更多的随机性. (5认同)
  • 好吧,这只是10种可能选择中的1种,那里的随机性空间不大 (2认同)

Pao*_*olo 8

$v = mt_rand() / mt_getrandmax();
Run Code Online (Sandbox Code Playgroud)

会这样做的.


如果您只想要一个小数位(如问题中的示例所示),只需要round()获得的值...

$v = round( $v, 1 );
Run Code Online (Sandbox Code Playgroud)

...或者计算0到100之间的数字并除以10:

$v = mt_rand( 0, 10 ) / 10;
Run Code Online (Sandbox Code Playgroud)


Nem*_*igo 6

根据 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 );
}
Run Code Online (Sandbox Code Playgroud)

尽管 random_int() 比 mt_rand() 更安全,但请记住,它也更慢。

此答案的先前版本建议您使用 PHP rand(),并且实现方式很糟糕。我想在不重复其他人已经说过的内容的情况下更改我的答案,现在我们来了。

  • 结果不会均匀分布,因为 1.0 的概率为 0.5。此外,您只能获得 0.1 的分辨率。 (3认同)

Oli*_*rth 1

转换为 float *并除以getrandmax()


* 看来在 PHP 的任意类型杂耍规则中强制转换是不必要的。不过,它会是其他语言的。

  • 规则不是任意的。 (3认同)
  • @Fuser97381:也许不是任意的,但肯定是作为一系列临时的事后想法而建立的,导致了一组令人讨厌的、不一致的规则。 (3认同)