IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

Algorithme de randomisation ... ( Hasard ...? ) [FAQ]


Sujet :

Assembleur

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 0
    Points : 314
    Points
    314
    Par défaut Algorithme de randomisation ... ( Hasard ...? )
    Salut à tous

    Je suis étudiant et je me demandais si vous pouviez m'aider sur le poitn suivant: il me faudrait trouver un moyen de tirer au sort un chiffre au hasard entre 1-9 avec ensuite une boucle permettant de prendre le reste des chiffres en indice

    exemple :
    on tire au hasard 7
    le 7 est utilisé comme indice de tableau
    ensuite je dois pouvoir utiliser séquentiellement les autres chiffres 1,2,3,4,5,6,8,9 au hasard...

    merci d'avance

    cordialement

    -- Miketrix

  2. #2
    Membre averti

    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 0
    Points : 314
    Points
    314
    Par défaut prendre un chiffre au hasard
    Salut,
    Je n'ai pas compris toute la question mais je peux te dire comment prendre un chiffre au hasard.
    Utilise l'interrupt 1Ah du Bios, function 00h: GET SYSTEM TIME, qui te retourne le nombre de clock ticks depuis minuit (note: donne par le timer 8254 sur ton board). Le resultat est sur CXX.
    Tu n'as qu'a utiliser dl qui te donne un chiffre entre 0 et 255 et que tu ramenes entre 1 et 9. Si tu ne veux pas tirer le meme chiffre, tu fais un cmp avec celui d'avant et une boucle.
    Dis moi si tu comprends mon charrabia.
    Luc

  3. #3
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Beaucoup de monde utilise l'horloge système directement pour tirer un nombre au hasard, et, je suis désolé si j'en vexe quelques uns, je trouve ça stupide !

    Le compteur de l'horloge (par ailleurs accessible à l'adresse 0000:046C) ne change que 18.2 fois par seconde. C'est lent ! Tu as le temps de tirer plusieurs centaines de nombres avant que le compteur ne soit incrémenté ! Tu te retrouveras donc avec 100 fois ou plus le même chiffre...

    Il existe des méthodes pour tirer des nombres pseudo-aléatoires, mais elles sont relativement compliquées, ce qui en refroidi pas mal. Je dois avoir sur mon disque, pardu dans un trou quelconque, un exemple complet d'algorithme pour tirer un nombre aléatoire : mais, primo, il est en Pascal, et, deuxio, il utilise le coprocesseur arithmétique (calcul sur nombres flottants).
    Si ça t'intéresse, je peux toujours chercher...

    Maintenant, si tu ne veux pas, libre à toi d'attendre 1 seconde entre chaque appel à l'horloge système.

    A noter aussi un inconvénient majeur : en interrogeant l'horloge système, les suites de nombres tirés aléatoirement seront toujours identiques, quelque soit le moment où le programme est lancé. Pour du hasard, on fait mieux...

    A+

  4. #4
    Membre averti

    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 0
    Points : 314
    Points
    314
    Par défaut
    Je crois que je n'ai pas compris exactement ce que tu veux faire.
    Je croyais que tu cherchais juste a savoir comment tirer quelques chiffres et les classer, dans ce cas, le timer me semble plus que suffisant.

    De tous evidence tu te trouves a un niveau bien plus eleve et tu cherches a tirer des 100 aines de nombres aleatoires dans le minimum de temps possible ce qui change evidemment le probleme.

    Dans tous les programmes que j'ai vu juqu'a present, le premier pas dans la recherche d'un chiffre aleatoire est de saisir une entree du timer, ce qui est VRAIMENT aleatoire puisque ce peut etre n'importe quoi entre 0 et 9 avec la meme probabilite.
    Ensuite, et la tu as raison, tirer sequntiellement la valeur du timer revient a plus d'aleatoire du tout

    Je me souviens d'avoir etudie des algorithme pour la recherche de chiffres aleatoires en prepa et je me souviens d'une chose: C'est CHAUD!
    Il faut definir une serie qui te donnera telle proportions de chiffres entre 0 et 9, et naturellement tout depend de ta fonction [y=f(f(...f(x)))].
    Je ne sais pas a quel niveau de recherche tu desires aller....

    Le principe: timer=x0
    x1=f(x0)
    x2=f(x1)
    etc...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    L'erreur faite avec l'horloge avec un simple modulo c'est que si tu demarres sur une meme sequence, ben tu auras tous les memes resultats!!!
    Tout depend du hasard... Si c'est un hasard pour une loterie, faut que tu certifies que ton random est bien improbable? ET LA TA FONCTION EST LOIN D'ETRE TRIVIALE. Si c'est un hasard pour t'amuser, tu peux utiliser l'horloge.... :roll:

    Rudolf, §Gama§
    Bingo! :roll:

  6. #6
    Membre averti

    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 0
    Points : 314
    Points
    314
    Par défaut
    [RandomPass: D§ 0 Rand: 06227_8134 B§ 001_1101]

    Random::
    push ecx edx

    mov eax D§Rand | movzx ecx B§Rand+4
    shrd eax ecx 1
    adc ch 0 | shr cl 1
    mov dl cl | shr dl 2 | and dl 1
    xor ch dl | shl ch 6 | or cl ch
    mov B§Rand+4 cl

    xor B§RandomPass 1
    If B§RandomPass = 1
    bswap eax
    Else
    xor B§RandomPass+1 1
    On B§RandomPass+1 = 1, ror eax cl
    End_If

    mov D§Rand eax
    pop edx ecx
    ret

    ____________________________________________________________________________________________

    Proc MaxRandom::
    Arguments @Max
    Uses ecx, edx

    mov eax D§Rand | movzx ecx B§Rand+4
    shrd eax ecx 1
    adc ch 0 | shr cl 1
    mov dl cl | shr dl 2 | and dl 1
    xor ch dl | shl ch 6 | or cl ch
    mov B§Rand+4 cl

    xor B§RandomPass 1
    If B§RandomPass = 1
    bswap eax
    Else
    xor B§RandomPass+1 1
    On B§RandomPass+1 = 1, ror eax cl
    End_If

    mov D§Rand eax

    mov ecx D@Max, edx 0 | div ecx | mov eax edx
    EndP

    ____________________________________________________________________________________________

    Proc RangeRandom::
    Arguments @Min, @Max
    Uses ecx, edx

    mov eax D§Rand | movzx ecx B§Rand+4
    shrd eax ecx 1
    adc ch 0 | shr cl 1
    mov dl cl | shr dl 2 | and dl 1
    xor ch dl | shl ch 6 | or cl ch
    mov B§Rand+4 cl

    xor B§RandomPass 1
    If B§RandomPass = 1
    bswap eax
    Else
    xor B§RandomPass+1 1
    On B§RandomPass+1 = 1, ror eax cl
    End_If

    mov D§Rand eax

    mov ecx D@Max, edx 0 | sub ecx D@Min | inc ecx | div ecx
    mov eax edx | add eax D§@Min
    EndP

    ____________________________________________________________________________________________

    RandomizeTimer::
    pushad
    call 'KERNEL32.GetTickCount'
    mov B§Rand al | shl D§Rand 8
    mov B§Rand ah | shl D§Rand 8
    mov B§Rand al | shl D§Rand 8
    mov B§Rand al | xor D§Rand 06227_8134
    popad
    ret

    ____________________________________________________________________________________________

    Proc Gauss::
    Arguments @Min, @Max
    Uses ecx, edx

    call RangeRandom D@Min D@Max
    push eax
    call RangeRandom D@Min D@Max
    pop ebx

    add eax ebx | shr eax 1
    EndP



    Betov. (désolé, je ne sais pas comment on fait pour que la mise en page ne soit pas détruite par l'editeur...

  7. #7
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    Const im1=2147483563;
          im2=2147483399;
          am=(1.0 /iM1);
          imm1=im1-1;
          ia1=40014;
          ia2=40692;
          iq1=53668;
          iq2=52774;
          ir1=12211;
          ir2=3791;
          ntab=31;      {En fait, c'est 32, mais pour le coup du Array...}
          ndiv=(1+imm1 div ntab);
          eps=1.2e-7;
          rnmx=1-eps;
    Var idum2,iy,idumg:longint;
        iv:array[0..ntab]of longint;
     
    Function ztu(Var idum:longint):real;
    Var j:integer;
        k:longint;
        temp:real;
    Begin
       If idum<=0 then
       Begin
          If -idum<1 then idum:=1 Else idum:=-idum;
          idum2:=idum;
          For j:=ntab+7 downto 0 do
          Begin
             k:=idum div iq1;
             idum:=ia1*(idum-k*iq1)-k*ir1;
             If idum2<0 then idum:=idum+im1;
             If j<ntab then iv[j]:=idum;
          End;
          iy:=iv[0];
       End;
       k:=idum div iq1;
       idum:=ia1*(idum-k*iq1)-k*ir1;
       If idum<0 then idum:=idum+im1;
       k:=idum2 div iq2;
       idum2:=ia2*(idum2-k*iq2)-k*ir2;
       If idum2<0 then idum2:=idum2+im2;
       j:=iy div ndiv;
       iy:=iv[j]-idum2;
       iv[j]:=idum;
       If iy<1 then iy:=iy+imm1;
       temp:=am*iy;
       If temp > rnmx then ztu:=rnmx
       Else ztu:=temp;
    End;
     
    Function haz(m:real):real;
    Var t:real;
    Begin
       t:=ztu(idumg);
       haz:=t*m;
    End;
    Avec cette procedure, tu as des nombres pseudo-aléatoires pendant plus que l'âge de l'univers, si tu n'en tires que 10 par secondes.
    Tu lances ztu avec un nombre n'importe lequel au départ, puis la proc te renvoye ton nmbre aléatoire et change la valeur de idum. Conserve cette valeur et c'est cette valeur que tu devra donner à ztu la fois suivante.

    Si tu commences deux fois avec le même nmbre, la suite sera identique. Je te donnes 500$ si tu me trouve un test qui met en défaut le caractère aléatoire de la suite. Note : les auteurs proposent 1000$ et je compte un peu me sucrer sur ton dos...

    Faudra sans doute adapter la proc aux autres langages que le TP (elle vient du C+) mais elle est ce qui se fait de mieux pour l'insatnt.

    Bonne journée.
    Laurent (le grand frère de Zdra)

  8. #8
    KDD
    KDD est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Si tu veux j'ai un algo de génération de nombre premier en assembleur
    c'est de l'assembleur 80286 donc sur 16 bits. si ça t'interrese je te le donne. Aujourd'hui c'est impossible car je n'est pas le code sous les yeux.
    j'ai vérifié le caractère aléatoire de cette suite avec une suite 100000 nb aléatoire donné en moins de 10 secondes il me semble.
    A+

  9. #9
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par KDD
    algo de génération de nombre premier
    Ca m'interesse, mais on ne parlais pas de nombres aleatoire.

    Le plus simple c'est de faire une multiplication et une addition, avec les nombres qui vont bien.Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    MAGIC_CONSTANT1 = 1103515245
    MAGIC_CONSTANT2 = 12345
     
     
    random:
            mov     eax, [randseed]
            imul    eax, MAGIC_CONSTANT1
            add     eax, MAGIC_CONSTANT2
            mov     [randseed], eax
            ret
    Code pompe chez Codemaster, j'ai pas verifie le caractere reelement aleatoire, mais ca avait l'air de marche. Il suffit evidement d'initialiser randseed, avec ce que l'on veut (horloge, num process, address segement cs ... au choix).

    Sinon, pour l'algo pour faire l'exo. Euh disons ca (pseudo-code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    tableau de 8 octers a 0
     
    i=0;
    pour i=1, i< 10 {
     
    do {
        a=random();
    } tq (tableau(a) ==1) ;
    i++
    }
    Au fait, c'etait de l'asm que tu voulais ??????

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 10h21
  2. Randomisation pondérée ? (jeu de hasard)
    Par n_tony dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/02/2006, 10h03
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo