可能性のある複製:
PHPでのランダムフロート
0から1.0の間のランダムな浮動小数点数を作成することは可能ですか(例:0.4、0.8など)。Randを使用しましたが、整数のみを受け入れます。
_mt_Rand() / mt_getrandmax();
_
Rand()
関数は通常、プラットフォームのC Rand()
実装に依存するため、通常は非常に単純なパターンで数値を作成するため、使用しないでください。 php.netに関するこのコメント を参照してください
単純に10で割るのはどうですか?
$randomFloat = Rand(0, 10) / 10;
var_dump($randomFloat);
//eg. float(0.7)
_$v = mt_Rand() / mt_getrandmax();
_
それを行います。
(質問の例のように)小数点以下1桁のみが必要な場合は、取得する値をround()
だけにします...
_$v = round( $v, 1 );
_
...または0から10の間の数を計算し、10で割る:
_$v = mt_Rand( 0, 10 ) / 10;
_
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()を使用し、恐ろしい実装を行っていました。他の人が既に述べたことを繰り返さずに答えを変更したかったのです。
この簡単な解決策はどうですか:
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;
}
これを試して
// 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()
で除算します。