Aide rnd

Résolu
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008 - 18 déc. 2006 à 03:26
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008 - 18 déc. 2006 à 23:54
bonsoir,
je ne savais pas trop ou mettre ca mais bon :-)
en gros admettons j'ai une liste de 1 a 50 (dans un listbox)
je fais un rnd cela me remplira donc le listbox avec 1 chiffre par ligne aleatoire entre 1 et 50
mais sans qu'il ne repete deux fois le meme jusque la ca va
disons que je supprime par exemple trois ligne qui comporterais le chiffre 9 , 43 et 26
comment une fois ses trois lignes supprimee (il m'en reste donc 47 lignes) faire que se sois de nouveau mis aleatoirement de 1 a 50 aleatoirement mais sans les trois chiffre 9 , 43 et 26 ???

car la je bloque si je refais un rnd entre 1 et 50 et que je repete l'action 47 fois les trois chiffres que j'ai enlever peuvent se retrouver dans le tirage mais comment faire pour que les elements supprimer entre deux tirage ne puisse se retrouver dans le suivant ? en sachant que les chiffres seront enlever aleatoirement
comme un jeu de carte sauf que quand on tire une carte on enleve donc ca valeur du tas et on remelange le tout sans cette carte la
vous voyez ?

bah ses ca que je n'arrive pas :-)
donc si quelqu'un aurais la soluce se serais genial ;-)

Merci d'avance
Diablaman

12 réponses

diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
18 déc. 2006 à 23:54
bon j'ai fini par trouver et fini le code sans aucun bug du moins apres des centaines d'essaies de tirage a l'aide d'amis je n'ai rencontrer aucunprobleme vla le code :

Private Sub CmdAdd_Click()
LstGenere.AddItem LstBan.List(LstBan.ListIndex)
LstBan.RemoveItem (LstBan.ListIndex)
End Sub



Private Sub CmdGenere_Click()
  Const nbmini = 1 '-----ici la borne inférieure
  Const nbmaxi = 10 '-----ici la borne supérieure
  Const nbatirer = 10  'ici le nombre de numéros aléatoires à sortir entre les 2 bornes
 
  fourch = nbmaxi - nbmini
 
  If fourch + 1 < nbatirer Then
    MsgBox "Il est impossible de tirer " & nbatirer & "nombres dans la fourchette comprise entre " _
    & nbmini & " et " & nbmaxi & " qui ne comprend que " & fourch + 1 & " nombres, VOYONS !!!"
    Exit Sub
  End If
 
  Randomize
 
  Dim tabl(nbmaxi - nbmini + 1) As Integer, i As Integer, a As String, ou As Integer
 
  For i = 0 To nbmaxi - nbmini
    tabl(i) = nbmini + i
  Next
 
  LstGenere.Clear
 
  For i = 0 To nbatirer - 1
    ou = Int(((fourch - i) * Rnd))
    a = a & vbCrLf & tabl(ou)
    LstGenere.AddItem tabl(ou) ' <<<<<<<<<<============pour ajouter à la listbox LstGenere
    tabl(ou) = tabl(fourch - i)
  Next
 
  For i = nbatirer - 1 To 0 Step -1
    For j = LstBan.ListCount To 0 Step -1
        If LstGenere.List(i) = LstBan.List(j) Then
            LstGenere.RemoveItem (i)
        End If
    Next
  Next
 
  Erase tabl  '<<<<<<<<<<===== on en profite pour libérér la mémoire
  Label1.Caption = LstGenere.ListCount
 
End Sub


Private Sub CmdSupp_Click()
LstBan.AddItem LstGenere.List(LstGenere.ListIndex)
LstGenere.RemoveItem (LstGenere.ListIndex)
End Sub



voila c'est exactement ca qu'il me fallais grand merci a toi qui ma donner 90% du code que j'ai bidouiller un peu pour arriver a mes fins :-)
ton idee de remettre en tableau etc est bonne mais apres quelques test pour mes besoins je prefere la methode que j'ai utiliser :-)

Merci bien
Dialaman
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
18 déc. 2006 à 03:37
Salut,

lorsque tu enlèves tes items de ta ListBox, il faut placer ces valeurs dans une variable (tableau) afin de, lors du nouveau randomize, vérifier la valeur générée par le Rnd et les valeurs du tableau.

Un simple If devrait suffir !

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2006 à 07:50
Bonjour,

Cette question revenant plusieurs fois, je vais m'attacher aujourd'hui à résoudre ce problème avec un seul tableau (même pas de listbox) et de façon rapide.

J'y étais parvenu il y a 4 ans et devrais donc être capable de retrouver mon raisonnement. Je m'y mets donc.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2006 à 08:18
Bon, c'est fait et c'est très rapide (moins d'un tiers de seconde, par exemple, pour sortir aléatoirement 5000 numéros parmi 5000)


Immédiat avec 50, bien sur !


Private Sub Command1_Click()
  Const nbparmi = 50 '      ici le nombre total
  Const nbatirer = 50  '         ici le nombre de numéros aléatoires à sortir du nombre total
  Randomize
  Dim tabl(nbparmi - 1) As Integer, i As Integer, a As String, ou As Integer
  For i = 0 To nbparmi - 1
    tabl(i) = i
  Next
  For i = 0 To nbatirer - 1
    ou = Int(((nbparmi - i) * Rnd))
    a = a & vbCrLf & tabl(ou)
    tabl(ou) = tabl(nbparmi - 1 - i)
  Next
  MsgBox a
End Sub


Le truc utilisé ici est l'un de mes trucs préférés pour résoudre plusieurs problèmes. Il est inspiré de la méthode du sapeur Camembert (un sapeur pompier un peu particulier qui bouchait un trou dans la cour de sa caserne en ... en faisant un autre)

Si cette méthode plait, je suggère qu'elle soit "rangée" quelque part (trucx et astuces ?) pour ne pas l'oublier.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2006 à 08:52
Il est clair que si tu veux tes résultats dans une listbox List1, tu enlèves le msgbox et fais ceci, tout simplement :

Private Sub Command2_Click()
  Const nbparmi = 500 'ici le nombre total
  Const nbatirer = 500  'ici le nombre de numéros aléatoires à sortir du nombre total
  Randomize
  Dim tabl(nbparmi - 1) As Integer, i As Integer, a As String, ou As Integer
  For i = 0 To nbparmi - 1
    tabl(i) = i
  Next
  For i = 0 To nbatirer - 1
    ou = Int(((nbparmi - i) * Rnd))
    a = a & vbCrLf & tabl(ou)
    List1.AddItem tabl(ou)   ' <<<<<<<<<<============pour ajouter à la listbox list1
    tabl(ou) = tabl(nbparmi - 1 - i)
  Next
  Erase tabl   '<<<<<<<<<<===== on en profite pour libérér la mémoire
End Sub
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
18 déc. 2006 à 18:04
la reponse me conviend evidement cela est parfait mais cependant le code de jmfmarques me pose un probleme , il tire bien x chiffre entre 0 et x mais il me tire 0 comment faire pour qu'il tire a partir de 1

et admettons j'ai un bouton supprimer je genere , je choisi un element je le supp (avec le bouton)
je stock le chiffre supprimer de la liste dans un tableau ou une variable ou autre comment faire pour que dans le prochain tirage il tire les numero sauf celui supprimer (ou les supprimer) ?

Merci d'avance
Diablaman
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2006 à 20:57
Tu devrais te servur de temps en temps de ce que tu as normalement autant que moi (les méninges).

Bon ! Tu n'as pas compris que je triaus les indices d'un tableau (et c'est ainsi toujours vrai) :

Voilà donc de l'élastique :

Private Sub Command3_Click()
  Const nbmini = 10 '-----ici la borne inférieure
  Const nbmaxi = 20 '-----ici la borne supérieure
  Const nbatirer = 11  'ici le nombre de numéros aléatoires à sortir entre les 2 bornes
  fourch = nbmaxi - nbmini
  If fourch + 1 < nbatirer Then
    MsgBox "Il est impossible de tirer " & nbatirer & "nombres dans la fourchette comprise entre " _
    & nbmini & " et " & nbmaxi & " qui ne comprend que " & fourch + 1 & " nombres, VOYONS !!!"
    Exit Sub
  End If
  Randomize
  Dim tabl(nbmaxi - nbmini + 1) As Integer, i As Integer, a As String, ou As Integer
  For i = 0 To nbmaxi - nbmini
    tabl(i) = nbmini + i
  Next
  List1.Clear
  For i = 0 To nbatirer - 1
    ou = Int(((fourch - i) * Rnd))
    a = a & vbCrLf & tabl(ou)
    List1.AddItem tabl(ou) ' <<<<<<<<<<============pour ajouter à la listbox list1
    tabl(ou) = tabl(fourch - i)
  Next
  Erase tabl  '<<<<<<<<<<===== on en profite pour libérér la mémoire
End Sub

Voilà en ce qui concerne ta première question !

En ce qui concerne la seconde ; je ne comprends pas !  Elle devient TOTALEMENT INUTILE !
Il te suffit pour celà d'utiliser, pour chaque tirage, l'index suivant de ta listbox (puisqu'elle est aléatoire !... et tu n'as nullement besoin, pour ce faire, de supprimer quoi que ce soit ...)
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
18 déc. 2006 à 21:26
arf tu ne comprend pas pourquoi je veux supprimer ...

j'ai un deck de 50 cartes donc le deck est melanger aleatoirement en debut de partie (d'ou ma premiere quizz)
donc il tire carte par carte donc l'index 0 a x
mais il se pourrais que par apres il doivent allez chercher une carte precise dans le deck de carte d'ou ma deuxieme question comment faire pour dire de remelanger tout ca mais sans les carte tiree par exemple il a tirer les carte 10/25 et 37 bah quand le jeu va se remelanger il dois refaire une liste aleatoire de 1 a 50 mais sans mettre dans la liste de nombre ses trois cartes tiree

tu vois se que je veux dire ?
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2006 à 21:43
Non !

Si tu ne peux plus tirer la carte roi, par exemple, parce qu'elle a déjà été tirée (utiulisation de l'index 1 de la listbox déjà arrangée aléatoirement).

Il se trouve qu'il suffit de choisir la carte correspondant à l'index 2 de ta lisbox (rangée aléatoirement d'entrée de jei, je te le répète), et ainsi de suite (index 3, puis 4 etc...)

Essaye et tu verras !

Ton problème n'est apparemment que dans ta concentration (ou alors tu n'exprimes qu'incomplètement la chose !)
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2006 à 21:50
Avant d'aller me coucher :

Je te fais remarquer que c'est la raison pour laquelle, dans un jeu de carte (quel qu'il soit), on ne touille qu'une seule fois avant le jeu.... et qu'ensuite, on puise ! (même motif, même punition ... et pour cause !)
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
18 déc. 2006 à 21:54
Ah oui !
Je te fais remarquer également que si tu tiens à touiller à nouveau, il te suffit d'alimenter ton tableau par les cartes restantes et de relancer le touillage..... (C'est totalement inutile, mais si tu y tiens, rien ne t'en empêche.... Tu n'attends quand même pas de moi que je t'écrives également ce petit détail fastochissimo à 4 sous, non ?....)
0
diablamanshadow Messages postés 419 Date d'inscription lundi 30 août 2004 Statut Membre Dernière intervention 28 janvier 2008
18 déc. 2006 à 23:10
pour ton information je ne fais pas un jeu de carte de 52 cartes predefinie comme la bataille ou autre mais un type de jeu t'elle que yugi , magic ou autres du genre ou il est possible d'allez rechercher dans le deck une carte precise ou donc par apres on dois remelanger le jeu entierement sans les cartes deja tiree ...
toi tu part de l'idee que je fais un jeu de carte classique et donc tu ne vois pas l'interet de remelanger les cartes en extirpant en dehors x cartes qui ne pourrons de nouveau plus etre dedans sauf que moi justement les cartes vont allez et vennir dans le deck et deonc a chaque fois je dois remelanger avec des chiffre en dehors puis de nouveau dedans etc ^^par exemple je tire 5 cartes une des carte permet d'allez chercher la carte x dans le deck je vais la chercher je dois donc remelanger sans les 5 carte + celle qui viens d'etre prise et disons que celle qui viens de prendre permet de remettre dans le deck 3 carte de la main bah allais et je dois remelanger en remettant ses valeur etc etc
tu vois se que je veux dire les chiffre donc l'id des cartes vont vennir et allez dans le deck et je dois donc prendre en compte le fais de faire un aleatoire sur une liste dynamique des fois j'aurais les id de 1 a 10 puis de 12 a 14 etc par apres je peux ravoir donc la carte 11 mais plus la 12 donc il faut que je puisse faire un rnd sur une liste

a ce momment la pour faire encore plus simple y aurais t'il une methode pour "desordonner" le contenu d'une liste ?

en gros je tape tout mes chiffres dans une liste et je dit tu melange que le contenu de la liste (donc plus par numero mais par l'index de la liste)
comme sa les chiffre qui resteront dans la liste ceux qui revienne ou partent non plus d'importance vu que je ne joue plus sur ces chiffres la mais sur ceux de l'index de la liste

je pense que c'est ca que tu voulais dire par melanger les index mais je ne suis pas sur :-)
0
Rejoignez-nous