Aller au contenu

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


Sujets conseillés

Posté (modifié)

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

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

Posté

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.

Posté

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

Posté

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)

Posté

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

Posté

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

Posté

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

Veuillez vous connecter pour commenter

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



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