Webmaster Hub: créer des nombres aléatoires mais non dupliqués - Webmaster Hub

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

créer des nombres aléatoires mais non dupliqués besoin d'un peu d'aide Noter : -----

#1 L'utilisateur est hors-ligne   Aenoa 

  • Groupe : Membre+
  • Messages : 284
  • Inscrit(e) : 28-octobre 10
  • Genre:Homme
  • Localisation:Tournai
  • Société:Je cherche...

Posté 21 juillet 2011 - 22:45

Bonjour / bonsoir,

je cherche actuellement à sélectionner, dans une tranche donnée (lignes 0 à 3000 par exemple), des chiffres qui ne seraient pas dupliqués.
j'ai, après de nombreuses tentatives, réussi à créer ce script:


$total = 3000;
$question_id = array();

		for($i = 1; $i <= 30; $i++)
		{
			$t = 0;
			$value = rand(0, $total);
				foreach($question_id as $a)
				{
					if($value == $a)
					{
						$t =1;
					}
				}
				
				if($t == 0)
				{
					$question_id[$i] = $value;
				}
				
					while($t == 1)
					{
						$value = rand(0, $total);
								foreach($question_id as $a)
									{
										if($value == $a)
										{
											$t =1;
										}
									}
								if($t == 0)
									{
										$question_id[$i] = $value;
									}
					}
		}



Ma question est la suivante : Est-ce que ce script est potable, bien construit ? Est-ce qu'à un moment ou un autre, le script pourrais poser problème, sachant qu'il me faut impérativement 30 résultats ?


Merci


cordialement,
Aenoa


EDIT : j'ai intégralement reformulé la question et le sujet, afin d'éviter d'encombrer le message de trop de code.

Ce message a été modifié par Aenoa - 21 juillet 2011 - 23:43.

Mon (très petit) site personnel

"Ce n'est pas parce que l'on ne sait pas, que l'on ne peut pas. L'on peut tout apprendre, avec de la motivation."
0

#2 L'utilisateur est hors-ligne   Leonick 

  • Groupe : Hubmaster
  • Messages : 1 313
  • Inscrit(e) : 07-mars 05
  • Genre:Homme
  • Localisation:Val de Marne

Posté 22 juillet 2011 - 00:45

en utilisant in_array() ça serait bien plus propre et plus rapide comme code
0

#3 L'utilisateur est hors-ligne   Aenoa 

  • Groupe : Membre+
  • Messages : 284
  • Inscrit(e) : 28-octobre 10
  • Genre:Homme
  • Localisation:Tournai
  • Société:Je cherche...

Posté 22 juillet 2011 - 01:07

très bien, merci beaucoup !
Mon (très petit) site personnel

"Ce n'est pas parce que l'on ne sait pas, que l'on ne peut pas. L'on peut tout apprendre, avec de la motivation."
0

#4 L'utilisateur est hors-ligne   SStephane 

  • Groupe : Fondateur
  • Messages : 460
  • Inscrit(e) : 06-février 09
  • Genre:Homme
  • Localisation:Grabels

Posté 22 juillet 2011 - 01:15

array_rand() & file() (pour lire les 'lignes' qui j'imagine sont dans un fichier) et ton script est réduit à 3 lignes de code, j'aurai tendance à penser que ton script est un peu compliqué ^^
_AT_Montpellier
L'héroïsme, c'est la seule manière de devenir célèbre quand on a pas de talent (l'homme aux initiales douteuses)
Venez tester votre niveau de compétence en PHP :-)
0

#5 L'utilisateur est hors-ligne   MarvinLeRouge 

  • Groupe : Hubmaster
  • Messages : 771
  • Inscrit(e) : 22-novembre 04
  • Genre:Homme
  • Localisation:Toulon

Posté 22 juillet 2011 - 09:52

Salut,

Alors, comme ça, à l'arrache :
  • un tableau contenant dans chaque case la valeur de l'index (oui c'est voulu)
  • tu choisis un index au hasard avec array_rand
  • tu la notes (genre dans un autre tableau)
  • tu supprimes la case en question du tableau


Et hop tu as un tirage d'index, sans remise.
Lorsqu'un lapin rouge naît, on le nomme Marvin, en mémoire de Marvin 1er qui détruisit la ville de Zautamauxime. Puis on le bannit car les lapins rouges, ça porte malheur.
0

#6 L'utilisateur est hors-ligne   Aenoa 

  • Groupe : Membre+
  • Messages : 284
  • Inscrit(e) : 28-octobre 10
  • Genre:Homme
  • Localisation:Tournai
  • Société:Je cherche...

Posté 22 juillet 2011 - 12:16

en fait, le "in_array" me sera bien utile, mais dans mon cas, le "array_rand" et le "list" n'ont pas lieu d'être.

dans mon cas, je dispose d'une énorme base de donnée, et je calcule le nombre de lignes.
ensuite, j'effectue un rand() entre 0 et le nombre de lignes - 1.

je récupère l'ID de la ligne, et je la met dans mon tableau ($question_id).

une fois les 30 chiffres obtenus, j'effectue un SELECT sur la table, avec un WHERE id='x'.
je met chaque paramètre dans une variable, dépendante pour chaque question ($question['n°-question']['colonne']).

ça fonctionne parfaitement, merci à tous de votre aide, je garde en mémoire les fonctions citées, elles me seront utiles pour plus tard ;)


cordialement,
aenoa
Mon (très petit) site personnel

"Ce n'est pas parce que l'on ne sait pas, que l'on ne peut pas. L'on peut tout apprendre, avec de la motivation."
0

#7 L'utilisateur est hors-ligne   SStephane 

  • Groupe : Fondateur
  • Messages : 460
  • Inscrit(e) : 06-février 09
  • Genre:Homme
  • Localisation:Grabels

Posté 22 juillet 2011 - 12:27

Je comprends pas grand chose, mais on dispose pas vraiment des éléments ^^ (ligne = tuple)

Dans le cas d'une base de données, pourquoi ne sélectionne tu pas au hasard dans ta base ? (order by rand() limit 0,30)
_AT_Montpellier
L'héroïsme, c'est la seule manière de devenir célèbre quand on a pas de talent (l'homme aux initiales douteuses)
Venez tester votre niveau de compétence en PHP :-)
0

#8 L'utilisateur est hors-ligne   Dadou 

  • Light or Dark Side ?
  • Groupe : Fondateur
  • Messages : 3 244
  • Inscrit(e) : 29-avril 04
  • Genre:Homme
  • Localisation:13 rue Offenbach, Barentin

Posté 22 juillet 2011 - 12:59

C'est la solution que j'allais proposer, c'est franchement la plus propre à mettre en place

SELECT * FROM question ORDER BY RAND() LIMIT 0, 30

« Demander ne coûte qu’un instant d’embarras ; ne pas demander, c’est être embarrassé toute sa vie. » (Proverbe japonais)
- Mon petit site a moi
0

#9 L'utilisateur est hors-ligne   Aenoa 

  • Groupe : Membre+
  • Messages : 284
  • Inscrit(e) : 28-octobre 10
  • Genre:Homme
  • Localisation:Tournai
  • Société:Je cherche...

Posté 22 juillet 2011 - 13:00

oui, mais je ne connaissais pas cette fonction SQL. j'ai évidement énormément encore à apprendre, et c'est en posant des questions ici que je compte m'améliorer ^^


merci à tous
Mon (très petit) site personnel

"Ce n'est pas parce que l'on ne sait pas, que l'on ne peut pas. L'on peut tout apprendre, avec de la motivation."
0

#10 L'utilisateur est hors-ligne   Leonick 

  • Groupe : Hubmaster
  • Messages : 1 313
  • Inscrit(e) : 07-mars 05
  • Genre:Homme
  • Localisation:Val de Marne

Posté 22 juillet 2011 - 14:19

vu ce que tu souhaites faire, le rand() en sql c'est le plus adapté
0

#11 L'utilisateur est hors-ligne   MarvinLeRouge 

  • Groupe : Hubmaster
  • Messages : 771
  • Inscrit(e) : 22-novembre 04
  • Genre:Homme
  • Localisation:Toulon

Posté 25 juillet 2011 - 12:43

Salut,

Le ORDER BY RAND() est mauvais niveau performance, surtout sur de grosses tables, il existe des alternatives.
Sinon, au lieu de faire une requète par id, fais-en une seule avec un
"WHERE id IN (" . implode(",", tabIndexes) . ")"

Lorsqu'un lapin rouge naît, on le nomme Marvin, en mémoire de Marvin 1er qui détruisit la ville de Zautamauxime. Puis on le bannit car les lapins rouges, ça porte malheur.
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)