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 |
|
|
| rnd: exclure un nombre tiré au hasard | |
| | Auteur | Message |
---|
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: rnd: exclure un nombre tiré au hasard Lun 14 Nov 2011 - 19:52 | |
| Bonsoir à tous les paronamiciens. Parfois dans un programme, on peut avoir besoin d'un nombre tiré au hasard dans un interval donné, mais un nombre doit en être exclus. Par exemple, dans mon premier exemple je tire au hasard 100 fois un nombre compris entre 0 et 49, mais je veux en exclure le chiffre 10. - Code:
-
dim a(100),i
list 1
for i=1 to 100 repeat a(i)=int(rnd(50)) until a(i) <>10 item_add 1,a(i) next i
dans ce second exemple, là j'exclus du tirage les chiffres 10,20,30,40. - Code:
-
dim a(100),i
list 1
for i=1 to 100 repeat a(i)=int(rnd(50)) until a(i) <>10 and a(i) <>20 and a(i)<>30 and a(i)<>40 item_add 2,a(i) next i
Jusque là, rien de bien difficile. Mais maintenant, si le nombre de chiffre à exclure du tirage aléatoire est plus important, peut-on créer un algorythme? Supposons que nous voulions tirer 100 nombres au hasard entre 0 et 99, et en exclure les nombres premiers, soit: 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 --> ce qui en fait 25! Je prend comme exemple les nombres premiers, mais ce pourrait être tous les chiffres se terminant par 0 et par 7, ou bien une séquence comme 2,3,4,15,16,17,28,29,30,41,42,43,54,55,56, etc... à exclure. Je trouve qu'il serait dur d'écrire: until a(i)<>2 and a(i)<>3 and a(i)<>5 and a(i)<>7 and a(i)<>11 etc... jusqu'à a(i)<>97 Pensez-vous qu'il y a un algorythme ou bien une autre manière de procéder? A bientôt | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: rnd: exclure un nombre tiré au hasard Lun 14 Nov 2011 - 20:52 | |
| Je vois pas trop ce que tu peux faire à part trouver l'élement commun et simplifier ton test... par exemple pour exclure 10, 20,30 test du modulo de la division par 10 les nombres premiers: par une procedure te levant un flag: - Code:
-
Primalite: Prim_Flg=1 FOR Prim_i = 2 to int(sqr(N)) if int(N/Prim_i)=N/Prim_i then Prim_Flg=0:exit_for NEXT Prim_i RETURN
etc..etc.. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: rnd: exclure un nombre tiré au hasard Lun 14 Nov 2011 - 21:20 | |
| Tu peux aussi placer les nombres à exclure dans une dlist, et rejeter le nombre tiré s'il est présent dans la dlist. Avantage: on peut charger la dlist par un fichier texte, par exemple, et on n'est nullement limité par le nombre de lignes... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: rnd: exclure un nombre tiré au hasard Lun 14 Nov 2011 - 22:49 | |
| Très bonne idée Klaus, Comme quoi ces DLIST c'est vraiment pratique !... | |
| | | Invité Invité
| Sujet: Re: rnd: exclure un nombre tiré au hasard Mar 15 Nov 2011 - 1:23 | |
| Il me parait plus rapide de faire une chaine du genre: " 10 15 20 30 " et de faire - Code:
-
if instr(" 5 10 15 20 30 "," "+str$(nb)+" ")>0 then ... nb étant le nombre à tester. Quand au nombre premier, je vous laisse faire. J'ai mis un espace, mais voyant l'exemple de bignolo, la virgule peut le remplacer. |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: rnd: exclure un nombre tiré au hasard Mar 15 Nov 2011 - 7:29 | |
| Tu peux même faire un mélange des deux !! - Code:
-
DATA " 5 10 15 20 25 " DATA " 1 3 5 7 9 " FOR I=1 TO 2: READ A$:ITEM_ADD LST_FILTRE,A$:NEXT I ... ... if instr(ITEM_READ$(LST_FILTRE,1)," "+str$(nb)+" ")>0 then ... .... ... if instr(ITEM_READ$(LST_FILTRE,2)," "+str$(nb)+" ")>0 then ...
Voilà, tu n'as que l'embarras du choix ! | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: rnd Mar 15 Nov 2011 - 8:53 | |
| Bonjour, Merci cosmos, c'est ta solution que je retiens, car elle marche dans les 2 sens. 1-exclure les nombres premiers: - Code:
-
dim a(100),i,c$ c$=",2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97," list 1
for i=1 to 100 repeat a(i)=int(rnd(100)) until instr(c$,","+str$(a(i))+",")=0 item_add 1,a(i) next i
2- en changeant le = par > : until instr(c$,","+str$(a(i))+",")>0 on ne tire que les nombres premiers en excluant tous les autres. Mais quoiqu'il en soit, la solution de Klaus est valable. Si j'avais 10000 nombres dans l'interval 0-5000 à tirer au hasard et qu'une liste de 500 nombres doit en être exclus, le recours à la DLIST chargée par un fichier texte est la solution. Dans ce cas la solution de cosmos pour mettre 500 nombres dans une chaine de caractère serait fastidieuse. A ce propos, quelle peut-être la longueur maximale d'une chaine de caractère que Panoramic peut accepter? A ce sujet, j'ai testé le code suivant: - Code:
-
dim c$,i for i=1 to 4680 c$=c$+"_" next i print c$ en mettant for i=1 to 4679; on voit le tracé de la ligne à l'écran, à partir de 4680, on ne voit plus rien. Bizzare? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: rnd: exclure un nombre tiré au hasard Mar 15 Nov 2011 - 14:26 | |
| Je crois qu'il n'y a pas de limite théorique à la longueur d'une chaîne de caractères, par exemple on peut mettre le contenu intégral d'un fichier de 2M dans une seule chaîne. Pratique pour des recherches. Par exemple je viens de mettre un fichier texte de 8,5 M dans une seule chaîne, c'est un peu long, surtout vers la fin (quelques longues minutes, mais je n'ai que 2G de mémoire vive), mais c'est possible. La limite à 4679, effectivement c'est curieux, mais ça doit être plutôt un problème d'affichage. | |
| | | Contenu sponsorisé
| Sujet: Re: rnd: exclure un nombre tiré au hasard | |
| |
| | | | rnd: exclure un nombre tiré au hasard | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |