Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flash > AS1/AS2
AS1/AS2 Questions relatives à la programmation ActionScript 1 et 2 (Cours AS2)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/04/2006, 17h12   #1
Invité régulier
 
Inscription : juillet 2005
Messages : 40
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 40
Points : 9
Points : 9
Par défaut [FLASH MX2004] Tirage (Math.random) et égalité stricte

Bonjour !

Après avoir tiré 3 nombres au hasard, encadrés entre 1 et 3 et placés dans les variables Nb1,Nb2,Nb3, je compare ceux-ci. Tant que je n'ai pas 3 nombres différents, je souhaite refaire un tirage. Mon problème est que je n'arrive pas à avoir cette condition. Voici le script que j'ai écris (et que je sais être faux ) :

Code :
1
2
3
4
5
6
7
8
if (_root.Nb1==_root.Nb2&& _root.Nb1==_root.Nb3 && _root.Nb2==_root.Nb3)
   {
   _root.txtVerif="Nombres identiques, on continue le tirage"; 
   }
  else
   {
   _root.txtVerif="Nombres différents, on arrête le tirage";   
   }
En effet, si on a Nb1=0 et Nb2=1 et Nb3=1, la dernière expression renverra true et je voudrais qu'elle renvoie false, comme les 2 premières !

Est-ce que quelqu'un a la solution ?

Merci d'avance !
cristolb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2006, 17h25   #2
Membre du Club
 
Inscription : mai 2004
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 57
Points : 48
Points : 48
salut,

Il suffit juste que tu utilises "ou" plutôt que "et" soit
Code :
1
2
 
if (_root.Nb1==_root.Nb2 || _root.Nb1==_root.Nb3 ||_root.Nb2==_root.Nb3)
là ça devrait marcher.
stip est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 12h20   #3
Invité régulier
 
Inscription : juillet 2005
Messages : 40
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 40
Points : 9
Points : 9
Merci Stip pour ta réponse. En effet, ça marche. C'était une grossière erreur d'algo ! Voici donc mon code, auquel j'ai ajouté un compteur pour tester le nombre de tirage.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
    //Initialisation
    _root.recupNb1=Math.round(Math.random()*(1-3))+3;
    _root.recupNb2=Math.round(Math.random()*(1-3))+3;
    _root.recupNb3=Math.round(Math.random()*(1-3))+3;
    _root.compteur=0;
 
    while (_root.recupNb1==_root.recupNb2 || _root.recupNb1==_root.recupNb3 || _root.recupNb2==_root.recupNb3)
    {
    _root.recupNb1=Math.round(Math.random()*(1-3))+3;
    _root.recupNb2=Math.round(Math.random()*(1-3))+3;
    _root.recupNb3=Math.round(Math.random()*(1-3))+3;
    _root.compteur++;
    }
 
     trace (_root.recupNb1);
     trace (_root.recupNb2);
     trace (_root.recupNb3);
     trace ("compteur :"+_root.compteur);
Par rapport au nombre de tirage : si on souhaite utiliser plus de nombre (disons jusqu'à 10 différents). Est-ce que cela ralentirait l'éxécution du script ?

Merci !
cristolb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 12h47   #4
Membre du Club
 
Inscription : mars 2005
Messages : 195
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 195
Points : 63
Points : 63
ça vas surtout faire long à taper (9*8*7*6*5*4*3*2*1=362880 tests pour 10 nombres (formule à confirmer! je la donne de tête!)) surtout si par la suite tu veux en rajouter!
Il est préférable de faire un test avec une boucle for (mais il faut que tu place les valeurs dans un tableau pour ça)!

pour la vitesse du script il faut tester! perso je peux pas te dire!
rteuteu55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 13h04   #5
Membre du Club
 
Inscription : mai 2004
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 57
Points : 48
Points : 48
C'est le genre de truc qui peut prendre un max de ressources de manière exponentielle.
Mais si tu y tient en changeant de nombre ta condition devient longue à gérer et tu devras la modifier à chaque changement. mais il y a une astuce avec une comparaison de tableaux
du style
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
var tableau:Array = new Array();
var nombreVoulu:Number= 10;
for (i=0; i<nombreVoulu+1; i++) {
    _root["recupNb"+i+1] = Math.round(Math.random()*(1-nombreVoulu))+nombreVoulu;
    tableau[i] = _root["recupNb"+i+1];
}
var pourComparaison:Array = tableau;
var identique:Boolean= false;
for (i=0; i<tableau.length; i++) {
    for (j=0; j<tableau.length; j++) {
        if (tableau[i] == pourComparaison[j]) {
            _root["recupNb"+i+1] = Math.round(Math.random()*(1-nombreVoulu))+nombreVoulu;
            tableau[i] = _root["recupNb"+i+1];
            pourComparaison[i] = tableau[i];
            identique=true;
        }
    }
    if (identique) {
        i=0;
    }
}
je n'ai pas eu le temps de le tester donc fait gaffe mais ça devrait marcher
stip est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 13h10   #6
Membre du Club
 
Inscription : mars 2005
Messages : 195
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 195
Points : 63
Points : 63
Citation:
Envoyé par stip
C'est le genre de truc qui peut prendre un max de ressources de manière exponentielle.
Mais si tu y tient en changeant de nombre ta condition devient longue à gérer et tu devras la modifier à chaque changement. mais il y a une astuce avec une comparaison de tableaux
du style
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
var tableau:Array = new Array();
var nombreVoulu:Number= 10;
for (i=0; i<nombreVoulu+1; i++) {
    _root["recupNb"+i+1] = Math.round(Math.random()*(1-nombreVoulu))+nombreVoulu;
    tableau[i] = _root["recupNb"+i+1];
}
var pourComparaison:Array = tableau;
var identique:Boolean= false;
for (i=0; i<tableau.length; i++) {
    for (j=0; j<tableau.length; j++) {
        if (tableau[i] == pourComparaison[j]) {
            _root["recupNb"+i+1] = Math.round(Math.random()*(1-nombreVoulu))+nombreVoulu;
            tableau[i] = _root["recupNb"+i+1];
            pourComparaison[i] = tableau[i];
            identique=true;
        }
    }
    if (identique) {
        i=0;
    }
}
je n'ai pas eu le temps de le tester donc fait gaffe mais ça devrait marcher
J'ai pas vue d'erreur! mais par-contre tu fait les tests en double!

Code :
1
2
3
4
5
 
......
for (i=0; i<tableau.length; i++) {
    for (j=i; j<tableau.length; j++) {
.....
ça te divisera le temps de test par 2!!
rteuteu55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 13h28   #7
Membre du Club
 
Inscription : mai 2004
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 57
Points : 48
Points : 48
Citation:
J'ai pas vue d'erreur! mais par-contre tu fait les tests en double!
Bien vu! ça évite de comparer le même index
stip est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 14h13   #8
Invité régulier
 
Inscription : juillet 2005
Messages : 40
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 40
Points : 9
Points : 9
Merci de vos réponses.

Je vais tester ça dès que j'aurai un peu plus de temps !
cristolb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2006, 11h02   #9
Invité régulier
 
Inscription : juillet 2005
Messages : 40
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 40
Points : 9
Points : 9
Bonjour !

J'ai essayé d'utiliser la méthode proposée mais les tests n'étaient pas concluants . En fait le problème semble venir de là :
Citation:
var pourComparaison:Array = tableau;
En effet, en parcourant les valeurs de pourComparaison, rien n'est renvoyé (undefined). J'ai donc transféré les valeurs de tableau dans pourComparaison avec une boucle. Ensuite, après la comparaison entre les 2 tableaux, les valeurs de sortie restaient identiques (tableau[i...n]==pourComparaison[i...n], alors que mon but est de tirer des nombres aléatoires TOUS différents.

J'ai essayé de modifier le code de cette manière :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pourComparaison=new Array;
for (i=0;i<tableau.length;i++)
 {
 pourComparaison[i]=tableau[i];
 }
 
var identique:Boolean=false;
chiffresRecup=new Array;
 
for (i=0;i<tableau.length;i++)
 {
 for (j=0;j<tableau.length;j++)
  {
  if (tableau[i]==pourComparaison[j])
   {
   _root["recupNb"+i+1]=Math.round(Math.random()*(0-nombreVoulu))+nombreVoulu;
   tableau[i]=_root["recupNb"+i+1];   
   identique=true;
   }
   if (tableau[i]!=pourComparaison[j])
    {
    chiffresRecup[i]=tableau[i];
    }
   }
 }
Le résultat obtenu est que les valeurs de tableau sont différentes après le test mais pas TOUTES différentes . Est-ce que vous voyez une solution ?

Merci d'avance !
cristolb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h44.


 
 
 
 
Partenaires

Hébergement Web