(PHP 8 >= 8.3.0)
Random\Randomizer::nextFloat — Renvoie un flottant sélectionné de l'interval ouvert à droite [0.0, 1.0)
Renvoie un flottant sélectionné de manière uniforme et équidistribué de l'interval ouvert à droite
de 0.0
jusqu'à, mais sans inclure, 1.0
.
La chance pour un flottant retourné d'être dans un sous-intervalle donné ouvert à droite
est proportionnelle à la taille du sous-intervalle.
Cela signifie que la chance pour un flottant d'être inférieur à 0.5
est de 50 %, ce qui est égal à la chance pour un flottant d'être au moins 0.5
.
De même la chance pour un flottant d'être dans l'interval ouvert à droite de
0.2
jusqu'à, mais sans inclure, 0.25
est exactement de 5 %.
Cette propriété permet de facilement utiliser Random\Randomizer::nextFloat() pour générer un booléen aléatoire avec une chance donnée en vérifiant si le flottant retourné est inférieur à une chance donnée.
Note:
Le domaine des flottants retournés par Random\Randomizer::nextFloat() est identique à celui de
Randomizer::getFloat(0.0, 1.0, IntervalBoundary::ClosedOpen)
.L'implémentation interne de Random\Randomizer::nextFloat() est plus efficace.
Mettre à l'échelle la valeur retournée à un intervalle différent en utilisant la multiplication ou l'addition (une transformation affine) pourrait résulter en un biais dans la valeur résultante car les flottants ne sont pas également denses à travers la ligne des nombres. Comme toutes les valeurs ne peuvent pas être exactement représentées par un flottant, le résultat de la transformation affine pourrait également résulter en des valeurs en dehors de l'intervalle demandé en raison d'arrondis implicites. Une explication détaillée des problèmes avec la transformation affine est donnée dans la documentation pour Random\Randomizer::getFloat().
Utiliser Random\Randomizer::getFloat() pour générer un flottant aléatoire dans un intervalle arbitraire. Utiliser Random\Randomizer::getInt() pour générer un entier aléatoire dans un intervalle arbitraire.
Cette fonction ne contient aucun paramètre.
Un flottant sélectionné de manière uniforme dans l'interval ouvert à droite
(IntervalBoundary::ClosedOpen
) [0.0, 1.0).
0.0
est une valeur de retour possible, 1.0
ne l'est pas.
Random\Randomizer::$engine
sous-jacent.
Exemple #1 Exemple de Random\Randomizer::nextFloat()
<?php
$r = new \Random\Randomizer();
// Le résultat du booléen sera vrai avec la chance donnée.
$chance = 0.5;
$bool = $r->nextFloat() < $chance;
echo ($bool ? "You won" : "You lost"), "\n";
?>
Résultat de l'exemple ci-dessus est similaire à :
You won
Exemple #2 Mise à l'échelle incorrecte en utilisant une transformation affine
<?php
final class MaxEngine implements Random\Engine {
public function generate(): string {
return "\xff";
}
}
$randomizer = new \Random\Randomizer(new MaxEngine);
$min = 3.5;
$max = 4.5;
// NE PAS FAIRE CECI:
//
// Cela affichera 4.5, malgré le fait que nextFloat() échantillonne
// à partir d'un intervalle ouvert à droite, qui ne retournera jamais 1.
printf("Wrong scaling: %.17g", $randomizer->nextFloat() * ($max - $min) + $min);
// Correct:
// $randomizer->getFloat($min, $max, \Random\IntervalBoundary::ClosedOpen);
?>
L'exemple ci-dessus va afficher :
Wrong scaling: 4.5