web-dev-qa-db-ja.com

0〜1.0 phpのランダムな浮動小数点数

可能性のある複製:
PHPでのランダムフロート

0から1.0の間のランダムな浮動小数点数を作成することは可能ですか(例:0.4、0.8など)。Randを使用しましたが、整数のみを受け入れます。

46
_mt_Rand() / mt_getrandmax();
_

Rand()関数は通常、プラットフォームのC Rand()実装に依存するため、通常は非常に単純なパターンで数値を作成するため、使用しないでください。 php.netに関するこのコメント を参照してください

94

単純に10で割るのはどうですか?

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

//eg. float(0.7)
25
h2ooooooo
_$v = mt_Rand() / mt_getrandmax();
_

それを行います。


(質問の例のように)小数点以下1桁のみが必要な場合は、取得する値をround()だけにします...

_$v = round( $v, 1 );
_

...または0から10の間の数を計算し、10で割る:

_$v = mt_Rand( 0, 10 ) / 10;
_
8
Paolo

PHPのドキュメントによると、PHP 7を使用している場合、 random_int を使用して暗号的に安全な擬似乱数整数を生成できます。

そうは言っても、これを利用して2つの数値の間にランダムな浮動小数点数を生成する関数を次に示します。

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()を使用し、恐ろしい実装を行っていました。他の人が既に述べたことを繰り返さずに答えを変更したかったのです。

3
Nemo Caligo

この簡単な解決策はどうですか:

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;
}
2
Dracony

これを試して

// 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);
}
2
Nandu

フロートするキャスト* getrandmax()で除算します。


* PHPの任意の型ジャグリングルールでは、キャストは不要であるようです。しかし、それは他の言語になります。
1