programme de tirage pour l'euromillion. A optimiser...

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Avatar de l’utilisateur
Alexandre
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 747
Inscription : 26 janv. 2007 22:14
Localisation : RP
Contact :

Re: programme de tirage pour l'euromillion. A optimiser...

Message par Alexandre » 10 nov. 2011 00:04

Et les mecs! On s'en fout de tirer les numéros dans l'ordre croissant. 8)
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

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
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...

Message par charognard » 10 nov. 2011 08:15

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)

jxano
Fonctionne à 2400 bauds
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...

Message par jxano » 10 nov. 2011 13:22

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.
Programmeur abscons.

Avatar de l’utilisateur
Alexandre
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 747
Inscription : 26 janv. 2007 22:14
Localisation : RP
Contact :

Re: programme de tirage pour l'euromillion. A optimiser...

Message par Alexandre » 10 nov. 2011 13:33

8O
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. :lol:
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
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...

Message par jxano » 10 nov. 2011 13:50

J'essaie de faire court. Si je détaillais tout, cela ferait une tartine indigeste qui me prendrait la journée à rédiger !
Alexandre a écrit :La seule correction que j'ai pour l'instant faite, c'est remplacer les NEXT par des GOTO.
Dans ce cas, tu peux te passer des FOR, aussi.

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.

Avatar de l’utilisateur
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7838
Inscription : 24 mai 2002 09:57
Localisation : France 69
Contact :

Re: programme de tirage pour l'euromillion. A optimiser...

Message par jvernet » 10 nov. 2011 16:14

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 ?
"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."

Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
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...

Message par gege » 10 nov. 2011 18:17

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;G
Hop
Pfff je fatigue là

Bravo Alexandre, le BASIC c'est sympa
G.E.

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
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...

Message par charognard » 10 nov. 2011 18:44

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...

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
Bien sur pas de problème pour intégré les complémentaires avec des OR bien placé ;)

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
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...

Message par C.Ret » 10 nov. 2011 19:51

Alexandre a écrit :Et les mecs! On s'en fout de tirer les numéros dans l'ordre croissant. 8)
Il faut juste les numéros et les étoiles.
C'est quand même plus pratique de les avoir dans l'ordre pour remplir sa grille !

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 suffixe % indique les variables entières.
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..

Avatar de l’utilisateur
badaze
Fonctionne à 14400 bauds
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...

Message par badaze » 10 nov. 2011 19:54

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...

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
Bien sur pas de problème pour intégré les complémentaires avec des OR bien placé ;)
T'as pas un problème si dans un tirage le RND te ramène 2 fois le même nombre ?
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.

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
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...

Message par charognard » 10 nov. 2011 20:26

Me suis trompé à la recopie :(
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
et là pas de problème il n'y en aura pas deux identique, et la mémoire écran c'est pinuts

Avatar de l’utilisateur
badaze
Fonctionne à 14400 bauds
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...

Message par badaze » 10 nov. 2011 21:21

charognard a écrit :Me suis trompé à la recopie :(
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
et là pas de problème il n'y en aura pas deux identique, et la mémoire écran c'est pinuts
Oui mais là tu gruges car virtuellement tu utilises 42 mémoires.
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.

Avatar de l’utilisateur
Antique
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 240
Inscription : 05 sept. 2011 10:09
Localisation : 73- Savoie

Re: programme de tirage pour l'euromillion. A optimiser...

Message par Antique » 10 nov. 2011 21:27

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

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
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...

Message par C.Ret » 10 nov. 2011 22:13

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

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..

Avatar de l’utilisateur
Antique
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 240
Inscription : 05 sept. 2011 10:09
Localisation : 73- Savoie

Re: programme de tirage pour l'euromillion. A optimiser...

Message par Antique » 10 nov. 2011 22:18

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 ?

Répondre

Revenir vers « Tous les Pockets »