JeuWeb - Crée ton jeu par navigateur
Incrémenter un champ avec la fonction rand() en php - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Incrémenter un champ avec la fonction rand() en php (/showthread.php?tid=6807)

Pages : 1 2 3


Incrémenter un champ avec la fonction rand() en php - Lindis - 29-01-2014

Re encore moi pour un deuxième topic de suite excusez mois en :$

Après avoir harpanté les topics possibles concernant mon envie d'update un champ mysql, je viens poser la question ici.

Je cherche à incrémenter une valeur comprise entre 0.50 et 0.90 à un champ de ma table et ceci aléatoirement.
Pour le moment l'update se fait bien, mais les chiffres incrémentés sont tous les mêmes quel que soit l'id de la ligne.
J'ai trouvé une fonction nommée rand() en php mais je ne vois pas comment l'utiliser avec mon update.
Je me suis pas mal documenté sur les fonctions pour trouver une solution à mes désirs mais je n'ai pas trouvé d'exemples de ce que je souhaiterais faire.


<?php
mysql_connect('***', '***', '***');
mysql_select_db('***');


$sql = "SELECT * FROM niveau1 WHERE id = id ";
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);

$sql ="UPDATE niveau1 SET taille = taille + 0.95 WHERE id = id ";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());


$sql ="UPDATE niveau1 SET eau = eau - 0.15 WHERE id = id ";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
mysql_close();

?>

Mon code n'est surement pas au top étant débutant dans le domaine php.

$sql ="UPDATE niveau1 SET taille = taille + 0.95 WHERE id = id ";

cette ligne ajoute 0.95cm à tous mes plants chaque heure, hors je me demande comment associer à celle ci la fonction rand() capable d'incrémenter entre 0.50 et 0.90 cm aléatoirement et surtout n'avoir que deux chiffres après la virgule

N'hésitez pas à remettre ce morceau de code en bon ordre si cela vous dit, sa m'aiderait à mieux comprendre mes erreurs Smile

Merci à vous la communauté J-W :roi:


RE: Incrémenter un champ avec la fonction rand() en php - xviniette - 29-01-2014


$ajout = rand(50, 90)/100;

dans l'update tu fais taille + $ajout.


RE: Incrémenter un champ avec la fonction rand() en php - Lindis - 29-01-2014

Ah cette solution pourrait être la bonne effectivement, je test sa de suite Smile
Merci Xviniette Smile



Ah non, j'ai mis 20 plants à pousser, et quand j'actualise mon script censé update les champs, les plants sont tous logés à la même enseigne Smile

Le code


<?php
mysql_connect('***', '*******', '***');
mysql_select_db('******');


$sql = "SELECT * FROM niveau1 WHERE id = id ";
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);


$ajout = rand(50, 90)/100;
$sql ="UPDATE niveau1 SET taille = taille + $ajout WHERE id = id ";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());


$sql ="UPDATE niveau1 SET eau = eau - 0.15 WHERE id = id ";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
mysql_close();

?>

Là il ajoute entre 0.50 et 0.90 cm à toutes mais le chiffre incrémenté est le même pour toutes les plantes.

Désolé d'être null Confusediffle:


RE: Incrémenter un champ avec la fonction rand() en php - Xenos - 29-01-2014

Dans tout soft informatique, il faut bien comprendre ce que fait la machine Smile

Lorsque tu utilises

$variable = $valeur1 + $valeur2;

Alors la machine évalue $valeur1, $valeur2, puis additionne les deux (avec des changements de types possibles). Le résultat est alors stocké dans $variable.

Ainsi, quand tu fais:

$ajout = rand(50, 90)/100.0

La machine évalue rand(), qui prend donc une valeur aléatoire entre 50 et 90. Ensuite, elle divise la valeur par 100. Enfin, la machine stocke ce résultat dans $ajout.
Après, si tu fais:

mysql_query("UPDATE niveau1 SET taille = taille + $ajout WHERE id = id ");

La machine procède de même:
Elle évalue la valeur de $ajout, et l'insère dans la requête. Enfin, elle envoie la requête à MySQL, qui reçoit (par exemple):

mysql_query("UPDATE niveau1 SET taille = taille + 0.7 WHERE id = id ");

D'où le fait que toutes les lignes soient incrémentées de 0.7
Si tu veux que la valeur aléatoire change d'une ligne à l'autre, tu dois dire au moteur MySQL de générer lui-même l'aléatoire à chaque ligne, via la fonction RAND():

mysql_query("UPDATE niveau1 SET taille = taille + RAND() WHERE id = id ");

RAND() renvoie une valeur entre 0 et 1, donc il te faut l'ajuster un peu pour avoir un résultat entre 0.5 et 0.9:

mysql_query("UPDATE niveau1 SET taille = taille + (0.5+0.4*RAND()) WHERE id = id ");

De façon annexe, pourquoi "where id = id"? Cette clause est inutile il me semble (à moins que le champ "id" puisse contenir la valeur NaN).

mysql_query("UPDATE `niveau1` SET `taille` = `taille` + (0.5+0.4*RAND())");

Enfin, "niveau1" comme nom de table me semble étrange... Cela sous-entend que tu as des tables "niveau2", "niveau3"... Préfères plutôt une table "niveaux", avec un champ "niveauPlante" supplémentaire.


RE: Incrémenter un champ avec la fonction rand() en php - Lindis - 29-01-2014

Xenos merci tout est aléatoire maintenant Smile
Jai donc modifié ma requête en:


$sql ="UPDATE niveau1 SET taille = taille + (0.5+0.4*RAND())";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

et le dernier soucis avant de vous laisser tranquils, est que je voudrais garder que deux chiffres aprés la virgule Smile
Car en ce moment j'ai:

0.60663425522543 Cm
Merci de vos réponses.

J'aime bien ton idée de mettre différents stades dans la table Niveau1 chose que je vais mettre en oeuvre Smile


RE: Incrémenter un champ avec la fonction rand() en php - xviniette - 29-01-2014

Désolé pour ma première réponse, je n'avais pas très bien compris ce que tu attendais.
Pour l'arrondie à deux chiffres, il existe la méthode ROUND. Ce qui te donne :


$sql ="UPDATE niveau1 SET taille = taille + ROUND(0.5+0.4*RAND(), 2)";



RE: Incrémenter un champ avec la fonction rand() en php - Lindis - 29-01-2014

Xviniette il n'y a pas de quoi Smile et maintenant sa fonctionne niquel.

Un grand merci, vous êtes super Smile

Et le jour ou tout deux vous avez besoin de mes services en matiére de graphismes, n'hésitez pas à me mp.


RE: Incrémenter un champ avec la fonction rand() en php - Xenos - 29-01-2014

Un petit détail quand on utilise les arrondis de nombre aléatoires: souvent, on perd l'équiprobabilité des valeurs.

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:
[Image: RAND_ROUND_equiprobabilite.PNG]

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 Wink

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.


RE: Incrémenter un champ avec la fonction rand() en php - Lindis - 29-01-2014

Merci Xenos, cool ton shèma, et très explicatif Smile

Bah sa ne me dérangera pas de voir que deux plants de la bdd font exactement la même taille, tant qu'ils ne sont pas tous égaux.
Car sa serait un peux trop beau pour les utilisateurs s'il pouvaient tous les passer au stade supérieur en même temps, c'est à dire dés 10 centimêtres atteints.

Par contre, je ne pense pas utiliser la table niveau1 pour les trois stades de la pousse, car aprés il va y avoir des chanps suplémentaires pour les grammes, et aussi il va falloir que je fasse un rand encore pour savoir quel plant sera male ou femelle,

Le male produira des graines, et les femelles des grammes Smile


RE: Incrémenter un champ avec la fonction rand() en php - MadMass - 29-01-2014

Les plantes ne sont pas sexuées, si ? :°