Tirage sans remise

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. Modérateur
    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


    1. Contributeur
      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
    2. Modérateur
      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.
    3. Contributeur
      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
    4. Modérateur
      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.
    5. sa ne marche pas chez moi !
      on met dit que do doit etre en fin d'instruction !
  2. 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