web-dev-qa-db-fra.com

Nombre flottant aléatoire entre 0 et 1.0 php

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.

46
Matthew Underwood
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

94
Francois Bourgeois

Pourquoi ne pas simplement diviser par 10?

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

//eg. float(0.7)
25
h2ooooooo
$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;
8
Paolo

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.

3
Nemo Caligo

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

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

Cast pour flotter* et diviser par getrandmax().


* Il semble que le casting n'est pas nécessaire dans les règles de jonglerie arbitraires de PHP. Ce serait dans d'autres langues, cependant.
1