Il faut juste les numéros et les étoiles. Comme à la télé.
programme de tirage pour l'euromillion. A optimiser...
Modérateur : Politburo
- Alexandre
- Fonctionne à 1200 bauds

- Messages : 747
- Inscription : 26 janv. 2007 22:14
- Localisation : RP
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
Et les mecs! On s'en fout de tirer les numéros dans l'ordre croissant.
Il faut juste les numéros et les étoiles. Comme à la télé.
Il faut juste les numéros et les étoiles. Comme à la télé.
Sharp PC1211/1212, CE122, PC1245/47/46s/51/60/61/62/70, CE125, PC1360/50, CE140P, PC1402, CE129P, PC1500/A, CE150, PC E500, EL1195. Canon X-07. Ti 57. Newton 110. HP-12C. Psion3a
- charognard
- Fonctionne à 9600 bauds

- Messages : 4411
- Inscription : 06 juin 2007 19:28
- Localisation : Indre et loire
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
l'idée serait de mémoriser les numéros déjà tirés dans un minimum de place.
Ma premiere idée est bien sur sous forme binaire le problème c'est qu'avec les filtres 16 bits de la plupart des pockets il va falloir segmenter et donc pour une optimisation c'est pas terrible.
Pas grave une seconde solution vient naturellement, c'est d'utilisé l'écran graphique de certain pocket pour stocker les valeurs.
soit les GCURSOR, GPRINT, POINT, AND.(PC1500)
soit les POINT, PSET (Canon X07, PC1600, PC1360...)
de plus l'écran de ces pockets (même le 1500) n'aura aucun problème pour stocker plusieurs tirage.
Si l'on se sert uniquement de l'écran comme stockage, le programme utilisera un minimum de variables (2 ou 3 à vu de nez)
Ma premiere idée est bien sur sous forme binaire le problème c'est qu'avec les filtres 16 bits de la plupart des pockets il va falloir segmenter et donc pour une optimisation c'est pas terrible.
Pas grave une seconde solution vient naturellement, c'est d'utilisé l'écran graphique de certain pocket pour stocker les valeurs.
soit les GCURSOR, GPRINT, POINT, AND.(PC1500)
soit les POINT, PSET (Canon X07, PC1600, PC1360...)
de plus l'écran de ces pockets (même le 1500) n'aura aucun problème pour stocker plusieurs tirage.
Si l'on se sert uniquement de l'écran comme stockage, le programme utilisera un minimum de variables (2 ou 3 à vu de nez)
-
jxano
- Fonctionne à 2400 bauds

- Messages : 2368
- Inscription : 17 févr. 2008 00:34
- Localisation : Paris 20ème
Re: programme de tirage pour l'euromillion. A optimiser...
Pour faire « comme à la télé », quand on a tiré la première boule, il en reste 49 dans la lessiveuse et pas n'importe lesquelles. Je symboliserais ça par une chaîne dans laquelle je découpe le caractère tiré au fur et à mesure. Ensuite, on coche le numéro dans un tableau de marque, une autre chaîne, éventuellement, comme la grille du joueur. On peut même dessiner directement une grille avec les cases à noircir, inutile de tester quoi que ce soit.
Pour le nombre aléatoire, je prendrais RND sur un entier très grand (un milliard), dont je calculerais le reste de la division entière par la longueur de la première chaîne.
Pour le nombre aléatoire, je prendrais RND sur un entier très grand (un milliard), dont je calculerais le reste de la division entière par la longueur de la première chaîne.
Programmeur abscons.
- Alexandre
- Fonctionne à 1200 bauds

- Messages : 747
- Inscription : 26 janv. 2007 22:14
- Localisation : RP
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
La seule correction que j'ai pour l'instant faite, c'est remplacer les NEXT par des GOTO.
Je ne sais pas comment sortir de ma boucle proprement en ligne 100.
Et sinon, je me réjouis de vous voir trouver des solutions auxquelles je ne comprends ab-so-lument-rien.
Et si je tentais un truc avec des DATA et des READ?
Sharp PC1211/1212, CE122, PC1245/47/46s/51/60/61/62/70, CE125, PC1360/50, CE140P, PC1402, CE129P, PC1500/A, CE150, PC E500, EL1195. Canon X-07. Ti 57. Newton 110. HP-12C. Psion3a
-
jxano
- Fonctionne à 2400 bauds

- Messages : 2368
- Inscription : 17 févr. 2008 00:34
- Localisation : Paris 20ème
Re: programme de tirage pour l'euromillion. A optimiser...
J'essaie de faire court. Si je détaillais tout, cela ferait une tartine indigeste qui me prendrait la journée à rédiger !
Commence effectivement avec des IF, des GOTO et des I=I+1, c'est encore ce qu'il y a de mieux pour comprendre ce qui se passe. Le dur, dans la programmation, et dans l'informatique en général, c'est de saisir les implicites : ce que la machine fait « toute seule » ou pas en fonction de ce qu'on a écrit.
Dans ce cas, tu peux te passer des FOR, aussi.Alexandre a écrit :La seule correction que j'ai pour l'instant faite, c'est remplacer les NEXT par des GOTO.
Commence effectivement avec des IF, des GOTO et des I=I+1, c'est encore ce qu'il y a de mieux pour comprendre ce qui se passe. Le dur, dans la programmation, et dans l'informatique en général, c'est de saisir les implicites : ce que la machine fait « toute seule » ou pas en fonction de ce qu'on a écrit.
Programmeur abscons.
- jvernet
- Fonctionne à 14400 bauds

- Messages : 7838
- Inscription : 24 mai 2002 09:57
- Localisation : France 69
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
Le hasard: en fait, on s'en fiche. Alexandre veut un système pseudo aléatoire de choix de numéros. Il ne fait pas un programme qui va tirer les résultats pour la FdJ et qui fausserais l’espérance de gain des parieurs par un hasard... hasardeux!
Donc toute méthode de choix bassement aléatoire conviendra !
N'importe grille tirée par ce programme aura la même probabilité de tirage, donc peut importe ! Il faut juste que les numéros tirés aillent de 1 à 50 et que sur quelques tirages on aie pas le même résultat à chaque fois.
Allez, qui publiera l'algo le plus simple/élégant pour sortir un tirage trié dans l'ordre croissant ?
Donc toute méthode de choix bassement aléatoire conviendra !
N'importe grille tirée par ce programme aura la même probabilité de tirage, donc peut importe ! Il faut juste que les numéros tirés aillent de 1 à 50 et que sur quelques tirages on aie pas le même résultat à chaque fois.
Allez, qui publiera l'algo le plus simple/élégant pour sortir un tirage trié dans l'ordre croissant ?
"l'ordinateur et l'homme sont les deux opposés les plus intégraux qui existent. L'homme est lent, peu rigoureux et très intuitif. L'ordinateur est super rapide, très rigoureux et complètement con."
- gege
- Fonctionne à 14400 bauds

- Messages : 7180
- Inscription : 31 janv. 2008 15:24
- Localisation : Banlieue Paârisienne
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
Alexandre a écrit :Et si je tentais un truc avec des DATA et des READ?
Code : Tout sélectionner
10 DATA 3,8,12,37,41,6,10
20 READ A,B,C,D,E,F,G
30 PRINT A;B;C;D;E;"+";F;GPfff je fatigue là
Bravo Alexandre, le BASIC c'est sympa
G.E.
- charognard
- Fonctionne à 9600 bauds

- Messages : 4411
- Inscription : 06 juin 2007 19:28
- Localisation : Indre et loire
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
En Z le nombre de nombre à tirer et en X le nombre maxi
ça sort une liste triée bien sur
Ici sur 1600, mais avec adaptation (ou pas) fonctionne sur PC1500,PC1360,G850...
Bien sur pas de problème pour intégré les complémentaires avec des OR bien placé 
ça sort une liste triée bien sur
Ici sur 1600, mais avec adaptation (ou pas) fonctionne sur PC1500,PC1360,G850...
Code : Tout sélectionner
10 CLS:Z=7,X=42
20 Y=RND X:GCURSOR Y:GPRINT 1;
30 Z+Z-1:IF Z GOTO 20
40 Z=1:FOR Y=1 TO X:IF POINT Y LET @(Z)=Y,Z=Z+1
50 NEXT Y
60 FOR Y=1 TO 7:PRINT @(Y);:NEXT Y- C.Ret
- Fonctionne à 9600 bauds

- Messages : 2483
- Inscription : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: programme de tirage pour l'euromillion. A optimiser...
C'est quand même plus pratique de les avoir dans l'ordre pour remplir sa grille !Alexandre a écrit :Et les mecs! On s'en fout de tirer les numéros dans l'ordre croissant.![]()
Il faut juste les numéros et les étoiles.
Ou alors, il faudrait que le Pocket Affiche la Grille, come cela je serais sûr de bien recopier.
Alexandre a écrit :Et sinon, je me réjouis de vous voir trouver des solutions auxquelles je ne comprends ab-so-lument-rien.
Pour faire simple, jxano et charognard proposent pour éviter de tirer deux fois le même nombre (ou la même étoile) de repérer les nombres (ou étoiles) à l'aide de deux techniques de "repérage".
Celle de jxano consiste à retirer les nombres au fur et à mesure des tirages de la chaine de caractères à partir de laquelle on fait justement le tirage. C'est comme pour le tirage des jetons numérotés d'un LOTO, on retire simplement le jeton du sac. (Tirages sans remise). Dans ce que propose jxano, la chaine de caractères est en quelque sorte le sac qui contient initialement tous les nombres.
La technique de Charo consiste à utiliser un indicateur pour chaque nombre. On lève l'indicateur lorsque le numéro qui lui correspond est tiré. Puis pour les tirages suivants, on évite de tirer un nombre dont l'indicateur est déjà levé. On peut utiliser autre chose que les bits ou des nombres binaires, mais comme l'information est élémentaire, on sait que d'utiliser un bit par indicateur permettra d'économiser au maximum la mémoire nécessaire.
Il existe d'autres techniques de programmation, en utilisant par exemple un tableau qui permettra d'être utilisé comme la sac de nombres ou comme le support d'indicateurs. Mais il existe d'autres moyens.
Ton code par exemple, bien que mal organisé, utilise un tableau contenant les valeurs tirées. C'est une technique qui peut être très efficace, elle consiste à vérifier à chaque tirage que le nombre obtenu n'est pas déjà dans le tableau des nombre tirés. Et on continue les tirages jusqu'à ce que les 5 nombres aient été obtenus de cette façon.
Il faut juste un peu réorganiser et simplifier ton code pour qu'il fonctionne bien mieux et soit plus clair ou plus logique. En particulier, il faut que tu réflechisse étape par étape. Quel est l'état initial du tableau des nombres N() avant le début des tirages, puis une fois le premier tirage effectué, ce qui change et comment on arrête les tirages.
Il y a aussi un point à méditer, c'est l'utilisation d'un pointeur. Par exemple si tu définit un compteur I, pourquoi ne pas l'utiliser pour tester ou affecter les valeurs du tableau simplement par N(I). On appèle cela l'adressage indirect.
jvernet n'impose pas de méthode particulière pour faire le tirage des cinq nombres, il suggère simplement de les afficher triés, ce qui est à mon sens une bonne idée car plus clair. Le tri peut être simplement vu come une étape supplèmentaire. Et un excercice fort interessant.
Concernant les DATA, je ne vois pas trop en quoi ils peuvent aider, sauf comme la fait gégé à toujours obtenir le même tirage d'une excution à l'autre !!?!!
Quand à C.Ret, son esprit malade propose de n'utiliser aucun test, et de simplement contrôler efficacement le tirage pseudo-aléatoire pour obtenir directement les cinq nombres dans l'ordre et si possible en évitant (ou du moins en tentant de minimiser) les éventuels biais.
Mais C.Ret vit dans un monde parallèle, il est tombé tout petit dans un chaudron de chimiométrie et il y a but la tasse. Depuis, il n'a plus droit d'en reprendre les druides s'y opposent formellement, ce pourrait être très dangereux !
Voici son polymère (euh pardon programme) en MicroSoft BASIC v.7 pour Commodore C128 :
Code : Tout sélectionner
10 PRINT "Grille EuroMIllions"
20 PRINT "Jouez les nombres:";:A%=1:B%=50:N%=5:GOSUB 1000
30 PRINT "et les etoiles :";:A%=1:B%=11:N%=2:GOSUB 1000
40 END
1000 REM =========== TIRE DANS L'ORDRE N% NOMBRES DISTINCTS ENTRE A% ET B% INCLUS
1010 X%=A%-1:IF B%<A%+N% THEN STOP
1020 FOR I=N% TO 1 STEP -1
1030 : X%=1+X%+(1+B%-I-X%)*RND(1)/I^(N%/(N%+1))
1040 : PRINT X%;
1050 NEXT I
1060 PRINT
1070 RETURN
Le sous-programme de la ligne 1000 effectue le tirage de N% nombres spseudo-aléatoire ordonnés et distincts entre les entiers A% et B%. Ou arrête l'execution du programme (ligne 1010) si ce qui est demandé est impossible.
Par exemple, on ne peut pas demander 10 nombres entiers distincts entre 2 et 3. Il faut qu'au minimum l'interval entre A% et B% contienne N% valeurs !
Mais, je ne conseille pas de suivre l'exemple des délires de C.Ret
Je pense qu'il est plus sage de suivre sa propre intuition et de continuer à trouver une solution convenable en utilisant le tableau des nombres ou des étoiles tirés comme dans ton code initial. Il suffit simplement de mettre d'y mettre un peu l'ordre et d'ajouter une procédure de tri. Elles ne sont pas dure à trouver sur le Net et Wikipedia.
Dernière édition par C.Ret le 10 nov. 2011 22:21, édité 1 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..
- badaze
- Fonctionne à 14400 bauds

- Messages : 7462
- Inscription : 12 févr. 2007 19:36
- Localisation : Pas très loin de Lyon
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
T'as pas un problème si dans un tirage le RND te ramène 2 fois le même nombre ?charognard a écrit :En Z le nombre de nombre à tirer et en X le nombre maxi
ça sort une liste triée bien sur
Ici sur 1600, mais avec adaptation (ou pas) fonctionne sur PC1500,PC1360,G850...Bien sur pas de problème pour intégré les complémentaires avec des OR bien placéCode : Tout sélectionner
10 CLS:Z=7,X=42 20 Y=RND X:GCURSOR Y:GPRINT 1; 30 Z+Z-1:IF Z GOTO 20 40 Z=1:FOR Y=1 TO X:IF POINT Y LET @(Z)=Y,Z=Z+1 50 NEXT Y 60 FOR Y=1 TO 7:PRINT @(Y);:NEXT Y
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
- charognard
- Fonctionne à 9600 bauds

- Messages : 4411
- Inscription : 06 juin 2007 19:28
- Localisation : Indre et loire
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
Me suis trompé à la recopie
Voilà la bonne maintenant
et là pas de problème il n'y en aura pas deux identique, et la mémoire écran c'est pinuts
Voilà la bonne maintenant
Code : Tout sélectionner
10 CLS:Z=7,X=42
20 Y=RND X:IF POINT Y=0 GCURSOR Y:GPRINT 1;:Z+Z-1
30 IF Z GOTO 20
40 Z=1:FOR Y=1 TO X:IF POINT Y LET @(Z)=Y,Z=Z+1
50 NEXT Y
60 FOR Y=1 TO 7:PRINT @(Y);:NEXT Y- badaze
- Fonctionne à 14400 bauds

- Messages : 7462
- Inscription : 12 févr. 2007 19:36
- Localisation : Pas très loin de Lyon
- Contact :
Re: programme de tirage pour l'euromillion. A optimiser...
Oui mais là tu gruges car virtuellement tu utilises 42 mémoires.charognard a écrit :Me suis trompé à la recopie![]()
Voilà la bonne maintenantet là pas de problème il n'y en aura pas deux identique, et la mémoire écran c'est pinutsCode : Tout sélectionner
10 CLS:Z=7,X=42 20 Y=RND X:IF POINT Y=0 GCURSOR Y:GPRINT 1;:Z+Z-1 30 IF Z GOTO 20 40 Z=1:FOR Y=1 TO X:IF POINT Y LET @(Z)=Y,Z=Z+1 50 NEXT Y 60 FOR Y=1 TO 7:PRINT @(Y);:NEXT Y
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
- Antique
- Fonctionne à 300 bauds

- Messages : 240
- Inscription : 05 sept. 2011 10:09
- Localisation : 73- Savoie
Re: programme de tirage pour l'euromillion. A optimiser...
euh je m'intercale dans la discussion, mais...
pour le tirage aléatoire le plus simple en générale;
on crée une variable dimensionnée de la longueur voulue (ici 50) à laquelle on donne une valeur différente pour chaque variable
par exemple dim a(50) : for i=1 to 50 : a(i)=i : next i
on tire un nombre au hasard entre 1 et 49 (par exemple 15)
on transfert la valeur de a(15) dans la 1ere variable (ici 15)
et pour éviter de retomber sur la même valeur pour a(15) on transfert la valeur de a(50) dans a(15)
au tirage suivant on fait choisi un nombre aléatoire entre 1 et 48
et on recommence de telle sorte qu'on peut extraire tout les nombres sans avoir deux nombres identique
pour le tirage aléatoire le plus simple en générale;
on crée une variable dimensionnée de la longueur voulue (ici 50) à laquelle on donne une valeur différente pour chaque variable
par exemple dim a(50) : for i=1 to 50 : a(i)=i : next i
on tire un nombre au hasard entre 1 et 49 (par exemple 15)
on transfert la valeur de a(15) dans la 1ere variable (ici 15)
et pour éviter de retomber sur la même valeur pour a(15) on transfert la valeur de a(50) dans a(15)
au tirage suivant on fait choisi un nombre aléatoire entre 1 et 48
et on recommence de telle sorte qu'on peut extraire tout les nombres sans avoir deux nombres identique
- C.Ret
- Fonctionne à 9600 bauds

- Messages : 2483
- Inscription : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: programme de tirage pour l'euromillion. A optimiser...
Si, si c'est une des méthodes les plus classique.
Mais contrairement au code proposé ci-dessus, il faut un tableau de 50 variables.
C'est énorme pour un Pocket !
Et en plus, le tirage n'est pas trié.
Le code proposé par Alexandre était plus économique en mémoire car il utilise de petits tableaux.
Il faut juste un peu simplifier et réorganiser son déroulement pour obtenir quelque chose de propre et efficace (au sens où nous l'entendons sur un Pocket).
Mais contrairement au code proposé ci-dessus, il faut un tableau de 50 variables.
C'est énorme pour un Pocket !
Et en plus, le tirage n'est pas trié.
Code : Tout sélectionner
10 M=50 : DIM V(M)
20 FOR I=1 TO M : V(I)=I : NEXT I
30 FOR T=1 TO 5
40 : LET X=INT RND M
50 : PRINT V(X);
60 : LET V(X)=V(M), M=M-1
70 NEXT T
Le code proposé par Alexandre était plus économique en mémoire car il utilise de petits tableaux.
Il faut juste un peu simplifier et réorganiser son déroulement pour obtenir quelque chose de propre et efficace (au sens où nous l'entendons sur un Pocket).
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..
- Antique
- Fonctionne à 300 bauds

- Messages : 240
- Inscription : 05 sept. 2011 10:09
- Localisation : 73- Savoie
Re: programme de tirage pour l'euromillion. A optimiser...
j'ai plus l'habitude des micros, du coup je sais pas trop de quoi vous disposez, je disais juste ça pour aider un peu notre ami débutant en basic, sinon avec une chaîne de caractères ?




