Chifres aléatoires non répétés

n_lefebvre Messages postés 2 Date d'inscription dimanche 11 janvier 2004 Statut Membre Dernière intervention 23 août 2004 - 22 août 2004 à 15:48
n_lefebvre Messages postés 2 Date d'inscription dimanche 11 janvier 2004 Statut Membre Dernière intervention 23 août 2004 - 23 août 2004 à 11:18
Salut,

Je débute un peu dans Flash et ActionS. Je dévelope un clip qui doit attribuer 22 chiffres de maniere aléatoire a dans un liste en Array, mais ils ne peuvent pas être répéter.
Voici mon code:
var sortir:Boolean = False;
var liste:Array = new Array();
for (var i:Number= 0; i<22; i++){
while (Sortir==false){
sortir = true;
var nbre:Number = Math.round(Math.random()*22);
for (var j:Number=0; j<=i; j++){
if (liste[j]==nbre){
sortir = false;
break;
}
}
}
liste[i] = string(randomNum);
sortir = false;
}

Mon problème est qu'apparement il doit être trop lourd car j'obtien l'erreur suivante:
"Un script de cette animation ralentit l'exécution de Flash Player. Si l'exécution n'est pas suspendue il est possible que votre ordinateur ne réagisse plus. Abandonner le script?"

Est-ce que quelqu'un pourrait m'aider ou m'éclairer si j'aurais pas fait une gaffe.

Merci d'avance.

Thanae

3 réponses

cs_adv Messages postés 149 Date d'inscription vendredi 30 mai 2003 Statut Membre Dernière intervention 28 janvier 2011 2
23 août 2004 à 09:59
Hello,
le problème vient de la sorte d'algorithme que tu utilises pour faire ta liste aleatoire. Si nous prenons l'exemple du dernier nombre aleatoire que tu cherches. Il n'y a plus qu'une seule possibilité et tu attends que ce soit un tirage aleatoire qui le sorte. Dans ton cas, il y a 1 chance sur 22 qu'il sorte, si il ne sort pas, à nouveau une chance sur 22.
C'est ton approche qui est fausse. Si j'ai bien compris, il faut une liste des nombres 0 à 21 dans un ordre aléatoire. Si c'est le cas, il te faut essayer à un algorithme du style :
- créé un tableau des nombres dans l'ordre.
for(i=0;i<nbreMax;i++){
liste.push(i);
}
- ensuite il te faut mélanger ces nombres :
for(i=0;i<nbreMelange;i++){
pos1 = Math.round(Math.random()*nbreMax);
pos2 = Math.round(Math.random()*nbreMax);
temp = liste[pos1];
liste[pos1] = liste[pos2];
liste[pos2] = temp;
}
Globalement, l'idée est là et ça devrait fonctionner. Pour le nombre de mélange, c'est à toi de voir, mais 50 devrait suffire.
Si tu rencontre un problème, n'hesite pas.
0
kingcobra Messages postés 316 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 19 septembre 2012
23 août 2004 à 11:09
salut,
moi j'ai peut etre un peu mieux (moins d'étapes aléatoires inutiles) :

//création de la liste
var liste = new Array(22);
for (var i = 0; i<22; i++) {
liste[i] = i;
}
//tmpliste sera le nouveau tableau rangé aleatoirement
var tmpliste = new Array();
var i = 0;
while (liste.length != 0) {
//un indice aléatoire
var rando = random(liste.length);
tmpliste[i] = liste[rando];
i++;
//on echange le premier element avec l'element selectionner par rando
liste[rando] = liste[0];
//on supprime le premier element
liste.shift();
}
//la trace renvoie la liste de 22 nombre aleatoire mais jamais pareil
trace(tmpliste);

voila t'a plus qu'a lire tmpliste dans l'ordre de 0 a tmpliste.length

KiNgCoBrA
0
n_lefebvre Messages postés 2 Date d'inscription dimanche 11 janvier 2004 Statut Membre Dernière intervention 23 août 2004
23 août 2004 à 11:18
Je vous remercie à tout les 2, c'est vrai que je n'y avais pas songé, comme quoi il y a toujours plus dans 2 (ou 3 ;-)) têtes que dans 1!
Je vais de ce pas tester et on verra! En tout cas un grand merci, car j'était vraiment bloquée là dessus depuis qqs jours.

Thanae
0
Rejoignez-nous