Duplicate possible:
Random Float in php
Est-il possible de créer un nombre flottant aléatoire compris entre 0 et 1,0, par exemple 0,4, 0,8, etc. J'ai utilisé Rand, mais il n'accepte que les entiers.
mt_Rand() / mt_getrandmax();
Évitez la fonction Rand()
, car elle dépend généralement de l'implémentation de la plate-forme C Rand()
, créant généralement des nombres avec un motif très simple. Voir ce commentaire sur php.net
Pourquoi ne pas simplement diviser par 10?
$randomFloat = Rand(0, 10) / 10;
var_dump($randomFloat);
//eg. float(0.7)
$v = mt_Rand() / mt_getrandmax();
fera cela.
Si vous souhaitez une seule décimale (comme dans les exemples de la question), il vous suffit de round()
la valeur que vous obtenez ...
$v = round( $v, 1 );
... ou calculez un nombre entre 0 et 10 et divisez-le par 10:
$v = mt_Rand( 0, 10 ) / 10;
Selon la PHP documentation, si vous utilisez PHP 7, vous pouvez générer un entier pseudo-aléatoire cryptographiquement sécurisé en utilisant random_int
Cela dit, voici une fonction qui utilise cela pour générer un flottant aléatoire entre deux nombres:
function random_float($min, $max) {
return random_int($min, $max - 1) + (random_int(0, PHP_INT_MAX - 1) / PHP_INT_MAX );
}
Bien que random_int () soit plus sécurisé que mt_Rand (), n'oubliez pas qu'il est également plus lent.
Une version précédente de cette réponse suggérait que vous utilisiez PHP Rand ()) et que sa mise en oeuvre était horrible. Je voulais changer ma réponse sans répéter ce que d'autres avaient déjà déclaré, et nous en sommes à présent.
que diriez-vous de cette solution simple:
abs(1-mt_Rand()/mt_Rand())
ou
/**
* 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;
}
Essaye ça
// 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);
}
Cast pour flotter* et diviser par getrandmax()
.