Un petit détail quand on utilise les arrondis de nombre aléatoires: souvent, on perd l'équiprobabilité des valeurs.
Si tu fais:
En revanche, si tu fais:
Alors les valeurs 0.50 et 0.90 seront deux fois moins probables que les autres.
En effet, pour avoir 0.50, il faut (0.5+0.4*RAND()) < 0.505, c'est à dire 0 <= RAND() < 0.0125.
Idem, pour 0.90, il faut 0.9875 <= RAND() < 1.00
Donc, la plage de valeurs de RAND() qui donne 0.50 (ou 0.90) fait 0.0125 de "largeur".
En revanche, pour tout autre nombre, par exemple 0.80, il faut 0.795 <= (0.5+0.4*RAND()) < 0.805. La plage de valeurs acceptables pour RAND() est alors de 0.025 !
Sur un petit dessin, cela se voit bien:
Ici, j'ai demandé à MySQL d'ajouter des centaines de milliers de lignes, en utilisant "ROUND(0.5+0.4*RAND(), 2)" comme valeur. Ensuite, je lui demande de compter combien de fois chaque valeur (0.50, 0.51, 0.52, ..., 0.90) apparait. On voit immédiatement que 0.50 et 0.90 apparaissent deux fois moins souvent que les autres
Pour des plages comme [0.50..0.90], c'est acceptable.
Mais si tu veux appliquer le même procédé à un ensemble de valeurs comme {1, 2, 3}, alors tu auras des écarts importants (1 et 3 apparaitront 25% du temps, alors que 2 apparaitra 50% du temps!)
En pratique, sans arrondis, on a le même problème, mais le nombre de valeurs étant tellement importants (167.773 valeurs possibles entre 0.5 et 0.51 !), cela ne se sent pas vraiment. En revanche, plus le nombre de valeurs permises sera réduit, plus cela se sentiras, dit autrement, plus l'arrondis sera fort (moins de chiffres après la virgule), plus le phénomène se sentira.
Si tu fais:
$sql ="UPDATE niveau1 SET taille = taille + (0.5+0.4*RAND())";
Alors toutes les valeurs entre 0.5 et 0.9 seront équiprobables (à epsilon près, l'arrondis intrinsèque de la machine).En revanche, si tu fais:
$sql ="UPDATE niveau1 SET taille = taille + ROUND(0.5+0.4*RAND(), 2)";
Alors les valeurs 0.50 et 0.90 seront deux fois moins probables que les autres.
En effet, pour avoir 0.50, il faut (0.5+0.4*RAND()) < 0.505, c'est à dire 0 <= RAND() < 0.0125.
Idem, pour 0.90, il faut 0.9875 <= RAND() < 1.00
Donc, la plage de valeurs de RAND() qui donne 0.50 (ou 0.90) fait 0.0125 de "largeur".
En revanche, pour tout autre nombre, par exemple 0.80, il faut 0.795 <= (0.5+0.4*RAND()) < 0.805. La plage de valeurs acceptables pour RAND() est alors de 0.025 !
Sur un petit dessin, cela se voit bien:
Ici, j'ai demandé à MySQL d'ajouter des centaines de milliers de lignes, en utilisant "ROUND(0.5+0.4*RAND(), 2)" comme valeur. Ensuite, je lui demande de compter combien de fois chaque valeur (0.50, 0.51, 0.52, ..., 0.90) apparait. On voit immédiatement que 0.50 et 0.90 apparaissent deux fois moins souvent que les autres
Pour des plages comme [0.50..0.90], c'est acceptable.
Mais si tu veux appliquer le même procédé à un ensemble de valeurs comme {1, 2, 3}, alors tu auras des écarts importants (1 et 3 apparaitront 25% du temps, alors que 2 apparaitra 50% du temps!)
En pratique, sans arrondis, on a le même problème, mais le nombre de valeurs étant tellement importants (167.773 valeurs possibles entre 0.5 et 0.51 !), cela ne se sent pas vraiment. En revanche, plus le nombre de valeurs permises sera réduit, plus cela se sentiras, dit autrement, plus l'arrondis sera fort (moins de chiffres après la virgule), plus le phénomène se sentira.