Aller au contenu

créer des nombres aléatoires mais non dupliqués


Aenoa

Sujets conseillés

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.

Modifié par Aenoa
Lien vers le commentaire
Partager sur d’autres sites

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é ^^

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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) . ")"

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...