0到1.0 php之间的随机浮点数[重复]

Posted

技术标签:

【中文标题】0到1.0 php之间的随机浮点数[重复]【英文标题】:Random float number between 0 and 1.0 php [duplicate] 【发布时间】:2012-12-18 19:13:03 【问题描述】:

可能重复:Random Float in php

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

【问题讨论】:

PHP Manual for mt_getrandmax中有一个官方的例子可以做到这一点 我的错,看了一眼,但没有遇到那个问题 另见:***.com/a/47190869/89818 为什么不让它变得简单。 rand(0,1).".".rand(0,100) 【参考方案1】:
mt_rand() / mt_getrandmax();

避免使用rand() 函数,因为它通常依赖于平台的C rand() 实现,通常以非常简单的模式创建数字。见this comment on php.net

更新:在 php 7.1 中,rand()has been changed 现在只是 mt_rand() 的别名。因此现在也可以使用rand()

【讨论】:

或者,为了更恰当地模拟我认为的标准随机化例程的 0.0(含)到 1.0 独占性质,请使用 mt_rand(0, mt_getrandmax() - 1) / mt_getrandmax() 请参阅***.com/a/47190869/89818 了解同时支持包含和独占变体的版本。 使用 PHP 7.0 rand 使用与 mt_rand 相同的生成器。但是,当max 小于min 时,参数的值会有不同的行为。【参考方案2】:
$v = mt_rand() / mt_getrandmax();

会这样做的。


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

$v = round( $v, 1 );

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

$v = mt_rand( 0, 10 ) / 10;

【讨论】:

【参考方案3】:

根据 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(),但实现很糟糕。我想改变我的答案,而不重复其他人已经说过的话,现在我们来了。

【讨论】:

结果不会均匀分布,因为 1.0 的概率为 0.5。此外,您只能获得 0.1 的分辨率。 花了我一些时间。几年过后。这样更好吗?【参考方案4】:

试试这个

// 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);

【讨论】:

【参考方案5】:

转换为浮点数*并除以getrandmax()


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

【讨论】:

规则不是任意的。 @Fuser97381:也许不是任意的,但肯定是作为一系列临时的事后考虑建立起来的,导致了一组令人讨厌的、不一致的规则。【参考方案6】:

这个简单的解决方案怎么样:

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;

【讨论】:

使用其他人的作品时,请始终参考您的来源。 ivankristianto.com/… 谢谢! 代码有错误:这行: if ( $min >$Max) $min=$Max; $最大值=$最小值; 应该是: if ( $Min >$Max) $min=$Max; $最大值=$最小值; 另外,没有必要保证$Min &lt; $Max——交换它们会产生数学上相同的概率分布…… 第一个解决方案无效。将两个独立的均匀分布的随机变量相除将得到一个均匀比率分布(尽管计算机总是离散的;这是一个近似值)。见en.wikipedia.org/wiki/Ratio_distribution。它有 1/4 的概率会返回一个大于 1 的数字(并且可以返回任何大小的数字,概率随着数字的平方而减小)。均匀的比率分布不再均匀分布。【参考方案7】:

简单地除以 10 怎么样?

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

//eg. float(0.7)

【讨论】:

好吧,它只会是 10 种可能的选择中的一种,没有太多的随机空间 @Dracony OP 似乎只想要 1 个小数。当然,可以选择任何数字 (rand(0, 10000) / 10000) 以产生更多小数,从而产生更多随机性。 @Dracony, h2oooooo: 要学究,随机性的数量不会改变...... @OliCharlesworth 当然你是对的——它是随机的,但是有更多的小数。 @Dracony: ...现在你有我的答案了 :-) ***.com/questions/14155603/…

以上是关于0到1.0 php之间的随机浮点数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

生成 0 到 1 之间的随机浮点数

php随机浮点数都有哪些?比如从0.1到3.0中随机一个浮点数出来?

打乱一个浮点数?

如何用C语言生成(0,1)之间的随机浮点数

Python玩转随机数,妈妈再也不会担心我不会随机数了

具有单个目标和命中目标机会的加权随机浮点数