Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Une petite SUB avec RND | |
| | Auteur | Message |
---|
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Une petite SUB avec RND Sam 2 Nov 2013 - 22:48 | |
| Bonsoir à tous, Voici une sub qui permet de tirer au hasard une suite de nombre dans un intervalle, sans jamais tirer 2 fois le même nombre. C'est très pratique pour mélanger un jeu de 32, 54 cartes ou un jeu de tarot (78 cartes) par exemple. Il suffit de déclarer la valeur minimale (qui sera exclue du tirage) et la valeur maximale (qui, elle sera incluse dans le tirage). Si l'on désire avoir des nombres négatifs, il suffira tout simplement de retrancher aux résultats une valeur fixe. Tout est expliqué dans le programme : - Code:
-
' ================================================================================== ' ================================================================================== ' SUB POUR TIRER AU HASARD DES NOMBRES QU'UNE SEULE FOIS DANS UN INTERVALLE DONNÉ ' L'INTERVALLE EST DÉLIMITÉ PAR 2 VARIABLES : "mini" ET "maxi" ' ATTENTION! DANS L'INTERVALLE, LA BORNE "mini" EST EXCLUE ' ================================================================================== ' ==================================================================================
width 0,1300 tirage(0,32): ' tirer tous les nombres entre 1 et 32 (mélanger un jeu de 32 cartes) tirage(10,40): ' tirer tous les nombres entre 11 et 40 tirage(62,75): ' tirer tous les nombres entre 63 et 75 tirage(99,115): ' tirer tous les nombres entre 100 et 115 tirage(10001,10015): ' tirer tous les nombres entre 10002 et 10015 end
sub tirage(mini,maxi) dim_local i,j,k,p(maxi-mini) j=int(rnd(maxi-mini))+mini+1:p(1)=j i=2 while i<(maxi-mini)+1 j=int(rnd(maxi-mini))+mini+1:p(i)=j for k=i-1 to 1 step -1 if p(k)=p(i) then p(i)=0 next k if p(i)=0 then i=i-1 i=i+1 end_while
for i=1 to (maxi-mini):print p(i);" ";:next i:print
' =========================================================================== ' =========================================================================== ' On peut aussi obtenir des nombres négatifs en retranchant une valeur à p(i) ' par exemple pour le premier exemple "tirage(0,32)" si l'on souhaite obtenir ' les nombres entre -15 et 16, il suffit de faire : ' =========================================================================== ' for i=1 to (maxi-mini):print p(i)-16;" ";:next i:print ' =========================================================================== ' ===========================================================================
end_sub
J'espère que ce sera utile. A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une petite SUB avec RND Dim 3 Nov 2013 - 1:05 | |
| | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 3 Nov 2013 - 12:54 | |
| Bravo Bignono,
Très pratique, je l' ai mise sur le site au rayon "Mathématiques". | |
| | | Invité Invité
| Sujet: Re: Une petite SUB avec RND Dim 3 Nov 2013 - 13:09 | |
| Bravo Bignono. Personellement avec Panoramic qui n'a pas de limite sur la longueur de chaine, en dehors de la mémoire disponible, je code différemment avec un résultat nettement plus rapide lorsque la liste est longue. - Code:
-
' ================================================================================== ' ================================================================================== ' SUB POUR TIRER AU HASARD DES NOMBRES QU'UNE SEULE FOIS DANS UN INTERVALLE DONNÉ ' L'INTERVALLE EST DÉLIMITÉ PAR 2 VARIABLES : "mini" ET "maxi" ' ATTENTION! DANS L'INTERVALLE, LA BORNE "mini" EST EXCLUE ' ================================================================================== ' ==================================================================================
width 0,1300 tirage(2,5) tirage(0,32): ' tirer tous les nombres entre 1 et 32 (mélanger un jeu de 32 cartes) tirage(10,40): ' tirer tous les nombres entre 11 et 40 tirage(62,75): ' tirer tous les nombres entre 63 et 75 tirage(99,115): ' tirer tous les nombres entre 100 et 115 tirage(10001,10015): ' tirer tous les nombres entre 10002 et 10015 end
sub tirage(mini,maxi) mini = mini-1 dim_local i,j,p(maxi-mini) , k$ k$ = " " : i= 1 while i<(maxi-mini)+1 j=int(rnd(maxi-mini))+mini+1 if instr(k$," " + str$(j) +" " ) = 0 then k$ = k$ +str$(j)+" ":p(i) = j : i= i +1 end_while
for i=1 to (maxi-mini):print p(i);" ";:next i:print
' =========================================================================== ' =========================================================================== ' On peut aussi obtenir des nombres négatifs en retranchant une valeur à p(i) ' par exemple pour le premier exemple "tirage(0,32)" si l'on souhaite obtenir ' les nombres entre -15 et 16, il suffit de faire : ' =========================================================================== ' for i=1 to (maxi-mini):print p(i)-16;" ";:next i:print ' =========================================================================== ' =========================================================================== end_sub |
| | | Mumu
Nombre de messages : 176 Localisation : 45 Date d'inscription : 20/12/2012
| Sujet: Re: Une petite SUB avec RND Dim 3 Nov 2013 - 17:39 | |
| Bonjour.
J'ai fait un test de rapidité sur les 2 sub's
tirage(0,200) 24 s / < 1 s tirage(0,300) 44 s / 1 s
Le 1er chiffre représente la sub de Bignono, le second celle de cosmos70
si on fait (0,1000) le temps reste de 14 s dans le second cas.
Evidemment, on ne fait pas un tirage sur 100 cartes tous les jours...
Je garde de toutes façons les 2 sub's. Merci à tous les 2 | |
| | | Invité Invité
| Sujet: Re: Une petite SUB avec RND Dim 3 Nov 2013 - 18:55 | |
| Je dois dire qu'avec des nombres je n'ai pas fait de teste de rapidité. Mais si tu mets avec le même principe toutes les instructions basiques de Panoramic, dans une chaines, séparées par un espace ( à moins que Panoramic est été remanié dans certaines fonctions depuis 3/4 ans), le résultat est immédiat pour savoir si un mot est dans la liste ou non. Avec ma méthode, j'arrive à écrire dans un edit une ligne basic, et pouvoir mettre une coloration syntaxique sans perturbation, mais ce n'est pas le cas en consultant une liste.
Maintenant il est vrai qu'il est normal qu'une liste de nombre aille plus vite que celle d'une chaine. J'espère que ce que je dis est toujours d'actualité. J'ai hésité avant de poster mon code, mais si tout ce que je dis est faux, autant que je m’arrête de poster. Pour autant j'ai pas le temps de refaire le teste. |
| | | Contenu sponsorisé
| Sujet: Re: Une petite SUB avec RND | |
| |
| | | | Une petite SUB avec RND | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |