Génération de trois chiffre non semblable au hazard

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Génération de trois chiffre non semblable au hazard

par Invité » 20 nov. 2007, 17:58

J'ai fais une petite erreur. La voila corrigée.
	<?php
	$tir1 = mt_rand(1, 21) . "\n";
	$tir2 = mt_rand(1, 21) . "\n";
	$tir3 = mt_rand(1, 21) . "\n";
		 
	function tirage($tir1,$tir2,$tir3) {mt_srand((float) microtime()*1000000);
	global $tir1, $tir2, $tir3;
	if( $tir1 != $tir2 && $tir2 != $tir3 && $tir1 != $tir3) {
	echo $tir1;
	echo $tir2;
	echo $tir3;
	}
	else
	tirage($tir1,$tir2,$tir3);
	}
	tirage($tir1,$tir2,$tir3);
	?>

par Eonn » 20 nov. 2007, 17:56

Voila ce que j'ai fais a partir de ce que tu m'a expliqué par l'exemple.
Mais bon je sais pas si c'est bon je n'ai jamais réelement apris le php.
<?php
$tir1 = mt_rand(1, 21) . "\n";
$tir2 = mt_rand(1, 21) . "\n";
$tir3 = mt_rand(1, 21) . "\n";

function tirage($tir1,$tir2,$tir3) {mt_srand((float) microtime()*1000000);
global $tir1, $tir2, $tir3
if( $tir1 != $tir2 && $tir2 != $tir3 && $tir1 != $tir3) {
echo $tir1;
echo $tir2;
echo $tir3;
}
else
tirage($tir1,$tir2,$tir3);
}
tirage($tir1,$tir2,$tir3);
?>

par Berzemus » 20 nov. 2007, 11:49

(petite parenthèse, mais je crois pas que ta DB aura des difficults avec "seulement" 10.000 requetes par jour..il va certes travailler un peu, mais pas de quoi le mettre en difficulté..)

par Ryle » 20 nov. 2007, 01:44

L'avantage de la bdd sur le serveur, c'est que quelque soit le poste utilisé, l'utilisateur retrouvera ses infos, alors que le cookie lui est conservé sur le poste client, et si l'utilisateur en change, il ne l'aura plus. Après tout dépend effectivement de l'intérêt et des données que tu mets dedans :)

Pour mon histoire de sortir les variables et de global, je vais passer par un exemple :
// voici deux variables et une fonction
$var1 = 1;
$var2 = 1;

function incremente() {
  global $var1; // le mot clé global indique que cette variable $var1 est la même que celle déclaré ci dessus
  $var1 = $var1 + 1; // incrémente la variable $var1 définie en dehors de la fonction
  $var2 = $var2 + 1; // incrémente la variable $var2 définie à l'intérieure de la fonction
}

incremente(); // je fais appel à la fonction et j'affiche les nouvelles valeurs :
echo $var1; // affiche "2" (le 1 de départ + 1 ajouté par la fonction)
echo $var2; // affiche "1" (le 1 de départ uniquement, puisque la fonction a modifié une variable différente, même si elle portait le même nom

par Eonn » 19 nov. 2007, 21:42

Merci Mr Ryle ^^

Je vais travaillé, recherché et vaincre ! (du moins je l'espere)
Cependant, pour optimisé le temps... et faire que ce processus soit compatible avec le plus de client possible, dois-je privilégié la BDD (qui pourrais être surcharger si 10 000 visite par jour... je rêve mais bon...) ou les cookies (qui eux peuvent être bloqués) sachant que je me fou qu'on modifit c'est données, ce sont juste des paramètres d'ambiance.

BDD ou cookies? chocolat ou praline?
:( c'est dur de choisir. Je pense que je vais plutot m'orienter vers la BDD pour le moment.

Deuxieme question : comment fait sortir les variables... qu'est ce que le global? (je vais aussi me renseigner après ce post, mais si j'ai une réponse dans mon contexte cela serais bien mieux ^^ )

Merci beaucoup

par Ryle » 19 nov. 2007, 20:42

Effectivement, le problème de ton premier code venait du fait que tu n'affichais les valeur que si au moins deux d'entre elles étaient identiques. Avec un différent (!=) et des ET (&&) tu t'assures que toutes les valeurs sont différentes.
De plus la récursivité (l'appel de la fonction à l'intérieur d'elle même) t'assures qu'au final tu auras bien 3 valeurs différentes (alors que précédement, tu pouvais risquer au second tirage d'avoir de nouveau des valeurs identiques)

Enfin, si tu veux pouvoir utiliser tes variables $tir1, $tir2, $tir3 en dehors de la fonction, il te faut les déclarer comme "global", sans quoi leur portée est limitée à l'intérieur de la fonction uniquement. ;)

Pour que la valeur soit associée à un utilisateur toute une journée il te faut stocker ces nombres quelque part. Tu as le choix entre deux endroits : le serveur (base ou fichier) ou le poste client (cookie). L'inconvénient du cookie, c'est que l'utilisateur peut le retrouver et le modifier.

Le mieux reste donc de les stocker dans une base de données. La bdd te permettra également de créer des comptes utilisateurs afin d'identifier l'utilisateur connecté et savoir que c'est à lui que correspondent les nombres tirés. (Tu peux éventuellement te passer du compte utilisateur et te servir de l'adresse IP pour identifier quelqu'un, mais tout le monde n'a pas une IP fixe et il se peut qu'elle change durant la journée). Enfin, il te suffit d'associer la date du jour lorsque tu enregistres le tirage en base et à chaque demande de tirage, vérifier qu'il n'y a pas déjà une entrée en base pour cette date et cet utilisateur. S'il n'y en a pas, tu peux l'ajouter. :)

(je sais, ça à l'air compliqué comme ça, mais en procédent doucement et par étape tu en viendras à bout :) N'hésites pas à jeter un coup d'oeil aux tutos du Site du Zéro et autre pour créer et manipuler des données en base)

par Invité » 19 nov. 2007, 19:48

Mon ami ma donné ce script :
<?php
function tirage($tir1,$tir2,$tir3) {
mt_srand((float) microtime()*1000000);
$tir1 = mt_rand(1, 21) . "\n";
$tir2 = mt_rand(1, 21) . "\n";
$tir3 = mt_rand(1, 21) . "\n";
if( $tir1 != $tir2 && $tir2 != $tir3 && $tir1 != $tir3) {
//if( $tir1 == $tir2 || $tir2 == $tir3 || $tir1 == $tir3) {
echo $tir1;
echo $tir2;
echo $tir3;
}
else
tirage($tir1,$tir2,$tir3);
}
tirage($tir1,$tir2,$tir3);
?>
Maintenant cela fonctionne. Mais j'ai une autre question. Comme expliqué si dessus, j'aimerai que les trois nombre généré par chaque visiteur leur soit attribué pour la journée. Comment faire? j'ai bien mon idée mais je ne suis pas assez intime avec php pour le faire seul. :(

par Eonn » 19 nov. 2007, 19:28

Merci j'ai remplacé les = par des == dans mon IF
Mais cela n'affiche toujours rien sur ma page : http://kepleralias.free.fr/index.php

par h0_noMan » 19 nov. 2007, 19:13

Affectation : =
Comparaison : ==

Génération de trois chiffre non semblable au hazard

par Eonn » 19 nov. 2007, 18:56

Voici un script que j'ai en parti fais. Je me suis inspiré d'un script déja existant et demandé quelque touche d'un amis.
        <?php
	 function tirage($tir1,$tir2,$tir3) {
		mt_srand((float) microtime()*1000000);
		$tir1 = mt_rand(1, 21) . "\n";
		$tir2 = mt_rand(1, 21) . "\n";
		$tir3 = mt_rand(1, 21) . "\n";
	}
	tirage($tir1,$tir2,$tir3);
	if( $tir1 = $tir2 || $tir2 = $tir3 || $tir1 = $tir3) {
		echo $tir1;
		echo $tir2;
		echo $tir3;
	}
	else
		tirage($tir1,$tir2,$tir3);
	?>
Mais voila cela ne fonctionne pas apparement, ou n'est pas affiché.
De plus j'aimerai que ce dernier reste le meme tirage pour chaque visiteur pour la journée.
VisiteurA vera un tirage alpha qui en reactualisant la page ne changera pas.
VisiteurB le meme jour aura un autre tirage de celui de visiteurA et de même en reactualisant ce tirage ne changera pas.

J'implore votre aide...
:oops:

Salutation.
Eon