Tirage sans remise

xXfalcon68Xx Messages postés 13 Statut Membre -  
xXfalcon68Xx Messages postés 13 Statut Membre -
Bonjour, Je fait un programe qui tire au sort un nombre, qui suivant celui-ci ouvriront une fenètre différente. Jusque la ça marche.
Mais plus loin, je dois re-tirer un nombre. mais celui-ci doit etre différent du premier.
Coment faire ?

Mon programme :

Private Sub CommandButton1_Click()
For i = 1 To x2 <> x1
    x = Int(9 * Rnd)
    Select Case x2
    Case 0: UserForm3.Show
    Case 1: UserForm4.Show
    Case 2: UserForm5.Show
    Case 3: UserForm6.Show
    Case 4: UserForm7.Show
    Case 5: UserForm8.Show
    Case 6: UserForm9.Show
    Case 7: UserForm10.Show
    Case 8: UserForme11.Show
    End Select
    If x2 = x1 Then
    End If
Next
End Sub


x1 est le premier nombre.
et x2 le nombre qui devrait etre tirer.

3 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Mais que veux tu faire exactement?

    Que signifie :
    For i = 1 To x2 <> x1
    ?

    Tu ne procèdes jamais au tirage de x1 et x2? juste x dans le code donné...

    Sinon, pour simplement répondre à ta question :

    Randomize Timer
    x1 = CInt(9 * Rnd())
    x2 = CInt(9 * Rnd())
    Do While x2 = x1 Or x2 = 9 Or x1 = 9
      x1 = CInt(9 * Rnd())
      x2 = CInt(9 * Rnd())
    Loop
    
    MsgBox x1 & "  " & x2


    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Salut pijaku,

      Pourquoi le Or x2 = 9 Or x1 = 9 ?
      Rnd() est toujours < 1 non ? CInt(9 * Rnd()) ne peut être = 9
      C'est bien parce qu'il n'y a pas grand chose à se mettre sous la dent... ;-)
      eric
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut Eric,

      Et bien, curieusement, lors de mes tests, il s'avère qu'il m'a trouvé des 9.

      Regarde ce test :
      Sub test()
      Randomize Timer
      x1 = CInt(9 * Rnd())
      x2 = CInt(9 * Rnd())
      Do While x2 = x1 Or x2 <> 9
        x1 = CInt(9 * Rnd())
        x2 = CInt(9 * Rnd())
      Loop
      
      MsgBox x1 & "  " & x2
      End Sub


      C'est bien parce qu'il n'y a pas grand chose à se mettre sous la dent... ;-)
      Oui, cette discussion arrive fort à propos. Je n'ai jamais réellement compris les résultats de ces tirages aléatoires et la nécessité de devoir y ajouter des tests pour obtenir les bons résultats, donc, parlons en.
      0
    3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Ah oui, je n'avais pas fait attention à ça.
      Tu utilises CInt (conversion qui te fait un arrondi à l'entier le plus proche) au lieu de Int (partie entière).
      En plus ça fausse la répartition. Le 0 se trouve sous-représenté de moitié du coup.

      Au début j'avais pensé à des possibles erreurs d'arrondis suite à la multiplication. Mais j'avais lancé plusieurs boucles 1 to 100 000 000 sans jamais le constater.

      Tant qu'on est dessus on peut raccourcir un peu :
      Randomize
      x1 = Int(9 * Rnd())
      Do
          x2 = Int(9 * Rnd())
      Loop Until x1 <> x2
      

      eric
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Voilà la réponse...
      Je me suis fais un blocage (de quelques années déjà... pfff!) sur CInt au lieu de Int.
      Bien vu et merci.

      Et bien donc xXfalcon a sa réponse.
      0
    5. xXfalcon68Xx Messages postés 13 Statut Membre
       
      sa ne marche pas chez moi !
      on met dit que do doit etre en fin d'instruction !
      0
  2. xXfalcon68Xx Messages postés 13 Statut Membre
     
    For i = 1 To x2 <> x10

    je voulais dire en gros qu il falait tirer un nombre jusqua ce que x2 ne soit pas egale a x2
    0
  3. xXfalcon68Xx Messages postés 13 Statut Membre
     
    heu que x1 ne soit pas egale a x2
    0