Un tirage du LOTO sans 2 fois le même numéro !

Un tirage du LOTO sans 2 fois le même numéro ! - C - Programmation

Marsh Posté le 07-01-2004 à 21:29:39    

Bonjour,
 
je dois faire un petit programme simple de tirage du LOTO, j'ai fait ceci :
 

Code :
  1. #include <iostream.h>
  2. int main(void)
  3. {
  4.   int val,i;
  5.   int tab[6];
  6.   srand( (unsigned)time( NULL ) );
  7.   cout<<"Voici le tirage du LOTO : "<<endl;
  8.   for(i=0;i<6;i++)
  9.   {
  10.   do
  11.   val=rand();
  12.   while(val>49);
  13.   cout<<val<<" ";
  14.   }
  15.   cout<<endl<<"\nMerci !";
  16.   cin>>val;
  17. }


 
Mon problème est que je dois interdire 2 valeurs identiques dans le tirage, je ne trouve pas de solution "propre", c'est à dire sans même chaque tirage dans une nouvelle variable puis tout vérifier etc. J'avais penser mettre les valeurs dans un tableau pour rendre leur manipulation plus aisée mais le problème de la comparaison reste entier, une petite idée/aide ? Merci !
 
 :hello:

Reply

Marsh Posté le 07-01-2004 à 21:29:39   

Reply

Marsh Posté le 07-01-2004 à 21:31:33    

ben tu fais un tableau de 49 elements trié par ordre croissant, pis apres tu fais 789505 inversion aleatoire, et a la fin tu lis ton tableau sequentiellement et vala

Reply

Marsh Posté le 07-01-2004 à 21:33:35    

Ben c'est pas non plus tellement propre comme méthode, le coup de faire une grille prête à mélanger ça me parait un peu barbare non ?

Reply

Marsh Posté le 07-01-2004 à 21:35:05    

boaf, c'est vite fait au moins, pis ca t'evite des tests, des verifs, toussa

Reply

Marsh Posté le 07-01-2004 à 21:37:45    

Ouais en fait c'est pas mal :), je pensais que remplir le tableau était plus chiant que ça mais ça tient en une vieille ligne :  
 
for(i=0;i<49;i++) tab[i]=i+1;
 
Pas contre le mélanger, je n'en ai aucune d'idée.


Message édité par Master_Jul le 07-01-2004 à 21:37:52
Reply

Marsh Posté le 07-01-2004 à 21:39:15    

ben comme tu melanges des cartes quand t'es un peu polio des mains

Code :
  1. for (int i=0;i<9;i++)
  2. tab[i] = i+1;
  3. for (int i=0;i<beaucoup;i++)
  4. {
  5. int a = rand()%9;
  6. int b = rand()%9;
  7. int tmp = tab[a];
  8. tab[a] =tab[b];
  9. tab[b] = tmp;
  10. }


 
 
 

Reply

Marsh Posté le 07-01-2004 à 21:44:54    

j'aime beaucoup cette méthode lol, merci beaucoup ;)

Reply

Marsh Posté le 07-01-2004 à 21:50:09    

bon sinon,  toujours personne pour recraché comment on se sert vraiment de rand() ? BlackGodess t'es ou ?
 
et on se calme, un peu avec le C++, ici c'est cat C :o
 
manque <cstdlib>
<ctime>
 
et toujours : allez voir chez Boost !

Reply

Marsh Posté le 07-01-2004 à 21:52:10    

taz a écrit :

bon sinon,  toujours personne pour recraché comment on se sert vraiment de rand() ? BlackGodess t'es ou ?
 
et on se calme, un peu avec le C++, ici c'est cat C :o
 
manque <cstdlib>
<ctime>
 
et toujours : allez voir chez Boost !


 
1/si mais on s'en fout
2/les sous cat deconnent je crois

Reply

Marsh Posté le 07-01-2004 à 21:53:24    

ben j'aimerais pas jouer à un loto ou les petits numéros ont statistiquement plus de chance de sortir, à moins d'être le seul à le savoir

Reply

Marsh Posté le 07-01-2004 à 21:53:24   

Reply

Marsh Posté le 07-01-2004 à 22:01:47    

Heu remarque peut-être bête : mais tu pourrais pas faire un tableau de 49 éléments avec chacun des 49 nombres, tu tires un nombre au hasard entre 1 et 49, tu prends ce nombre, tu mets à la place le dernier élément du tableau, et ensuite tu tires un nombre entre 1 et 48 ... et ainsi de suite .
Exemple:
on a 1 2 3 4 5
tu tires 3
tu mets 5 a la place de 3
tu te retrouves avec un tableau de 4 éléments (5 en fait mais tu ne prends en compte que les 4 premiers):
1 2 5 4 (5)
tu tires 2
tu mets 4 à la place du nombre en position 2, etc ...
 
Comme ça tu es sûr de ne jamais tomber sur le même numéro.
 
Ca pourrait marcher ?

Reply

Marsh Posté le 07-01-2004 à 22:03:21    

voire même std::random_shuffle
http://sgi.com/tech/stl/random_shuffle.html

Reply

Marsh Posté le 07-01-2004 à 22:05:26    

J'ai un problème que je ne m'explique pas pour le moment, ce code me donne 1,2,...,47,48,48. Pourquoi 2 fois 48 et pas 49 ??
 
  int tab[48];
  for(i=0;i<49;i++) tab[i]=i+1;
  for(i=0;i<49;i++)
  cout<<tab[i]<<" ";


Message édité par Master_Jul le 07-01-2004 à 22:05:47
Reply

Marsh Posté le 07-01-2004 à 22:07:00    

1) parce que tu fais un dépassement
2) parce que i est sur [0;49[ <=> [0;48]

Reply

Marsh Posté le 07-01-2004 à 22:07:21    

J'ai mis ce topic dans C parceque la dernière fois que j'ai posté dans C++ je me suis fait incendié parceque les seuls bouts de code C++ était les cin/cout. Ce code n'a pas plus d'intérêt en C++ d'ailleurs, dumoins je n'ai pas le droit (pour parler en gros) d'utiliser des éléments du C++ à part cin/cout et qq fioritures.

Reply

Marsh Posté le 07-01-2004 à 22:08:44    

taz a écrit :

1) parce que tu fais un dépassement
2) parce que i est sur [0;49[ <=> [0;48]


 
for(i=0;i<49;i++) tab[i]=i+1;  
 
 
Ne veut pas dire : "Quand i=48 (dernière valeur du for), mettre dans tab[48]=48+1" ??


Message édité par Master_Jul le 07-01-2004 à 22:08:56
Reply

Marsh Posté le 07-01-2004 à 22:09:13    

comment ça tu n'as pas le droit ? quand tu fais du C, tu utilises bien srand, time, printf, etc ? ben quand tu fais du C++, tu utilises également la bibliothèque qui va avec.

Reply

Marsh Posté le 07-01-2004 à 22:09:47    

Master > à ouaip. dans tous les cas y a overflow

Reply

Marsh Posté le 07-01-2004 à 22:12:52    

taz a écrit :

comment ça tu n'as pas le droit ? quand tu fais du C, tu utilises bien srand, time, printf, etc ? ben quand tu fais du C++, tu utilises également la bibliothèque qui va avec.


 
Je suis en formation de C++, on n'apprend pas le C, directement le C++, mais comme on a rien vu de la programmation objet, c'est un C à la syntaxe liftée. Quand je dis "je ne peux pas utiliser" c'est la bibliothèque standard, les "std::random_shuffle", je ne connais pas encore donc "pas le droit".

Reply

Marsh Posté le 07-01-2004 à 22:13:34    

taz a écrit :

Master > à ouaip. dans tous les cas y a overflow


 
Pas compris. :??:

Reply

Marsh Posté le 07-01-2004 à 22:14:01    

jusqu'a preuve du contraire, cin et cout sont des objects, alors que std::random_shuffle n'est qu'une pauvre fonction ...
 
ce que tu dis est assez stupéfiant. évidemment, si tu apprends pas, tu connais pas

Reply

Marsh Posté le 07-01-2004 à 22:14:27    

int tab[48];
 
le tab[i] avec i==48, il en chie un peu là

Reply

Marsh Posté le 07-01-2004 à 22:17:37    

@taz : Je ne suis qu'un pauvre élève, je fais avec ce qu'on me dit, on me dit que cin et cout sont des "fonctions particulières" du C++, ben je me base sur ça. Peut être que le prof ne veut pas nous embrouiller et qu'on apprendra les choses de manière plus correcte quand on verra ce que c'est la programmation orientée objet. :??: Je suis innocent. :'(

Reply

Marsh Posté le 07-01-2004 à 22:19:33    

@taz : Ah ouais, c'est une erreur stupide. Au fait, tu désaprouve la méthode de chrisbk ? Au sujet de la probabilité des "plus petits numéros", je n'ai pas compris à qui et pourquoi tu t'adressais.

Reply

Marsh Posté le 07-01-2004 à 22:20:33    

bah moi, j'ai appris le C en premier. on m'a appris que les opérateurs binaires << et >> servent à faire des décalages avec des entiers.
 
alros quand j'ai débarqué en C++, si on m'avait dit la même chose, j'aurais mis 2 claques aux profs.
 
parce qu'encore une fois, ça ne concerne pas la POO, juste la surcharge de fonction et d'opérateurs qui est présentent dans des langages qui ne supportent pas la POO

Reply

Marsh Posté le 07-01-2004 à 22:21:00    

ben tu fais une petite recherche, et tu vois 26 bons usages de rand()

Reply

Marsh Posté le 07-01-2004 à 22:22:06    

Reply

Marsh Posté le 07-01-2004 à 22:24:42    

Parfait, merci beaucoup. :jap:
 
Bon ben je vais lire mon Stroustrup et mon Oreilly, ça me sera peut être utile à voir ce qu'est vraiment le C++.

Reply

Marsh Posté le 07-01-2004 à 22:25:37    

ouaip, parce que là, on est au niveau mauvais C :D

Reply

Marsh Posté le 08-01-2004 à 06:39:42    

mouai, moi j'aurai fait un rand, et j'aurai mis dans un tableau a X case que le numéro était déjà sorti... si le numéro 1 est sorti, alors je mets la case tab[1] = 1, au départ tout étant un zéro.
 
Ensuite, il suffit de faire un rand, et vérifier si le nombre est déjà sorti [:spamafote]
 
Pourqoi personne a tilisé cette solution ? :??:

Reply

Marsh Posté le 08-01-2004 à 11:10:25    

Tetedeiench a écrit :

mouai, moi j'aurai fait un rand, et j'aurai mis dans un tableau a X case que le numéro était déjà sorti... si le numéro 1 est sorti, alors je mets la case tab[1] = 1, au départ tout étant un zéro.
 
Ensuite, il suffit de faire un rand, et vérifier si le nombre est déjà sorti [:spamafote]
 
Pourqoi personne a tilisé cette solution ? :??:


 
Trop lourd. Moins il reste de numéro, et plus c'est long et tu testes des trucs inutiles.
La meilleure méthode me semble celle déjà énoncée, à  savoir tirer entre 0 et 49, puis tirer entre 0 et 48 etc... et procéder donc avec un tableau.

Reply

Marsh Posté le 08-01-2004 à 11:14:04    

Tetedeiench a écrit :


Pourqoi personne a tilisé cette solution ? :??:


paske c nul :o

Reply

Marsh Posté le 08-01-2004 à 11:21:51    

Tu dois générer des numéros aléatoires entre 1 et 49, donc tu fais une fonction qui t'en fournit un à chaque appel.  
 
Tu dois tirer 6 numéros différents, donc il te faut un tableau pour les stocker.  
 
Quand tu as reçu un numéro de ta fonction, tu parcoures ton tableau pour voire si il y est déjà, si non tu l'ajoutes.  
 
Tu recommence tant que tu n'as pas tout tes numéros...
 
Il est où le problème??? ( c'est un troll c'est ça :-))


Message édité par avander le 08-01-2004 à 11:23:26
Reply

Marsh Posté le 08-01-2004 à 11:36:51    

Avander a écrit :

Tu dois générer des numéros aléatoires entre 1 et 49, donc tu fais une fonction qui t'en fournit un à chaque appel.  
 
Tu dois tirer 6 numéros différents, donc il te faut un tableau pour les stocker.  
 
Quand tu as reçu un numéro de ta fonction, tu parcoures ton tableau pour voire si il y est déjà, si non tu l'ajoutes.  
 
Tu recommence tant que tu n'as pas tout tes numéros...
 
Il est où le problème??? ( c'est un troll c'est ça :-))


 
parce que si tu dois tirer 48 numéros parmi 49, les derniers numéros risquent de faire longs...
 
c'est toi le troll !  :D

Reply

Marsh Posté le 08-01-2004 à 11:46:03    

Pour optimiser la methode du crible c'est super facile quand même. Tu notes N le nombre d'elements restant et tu tire un nombre aléatoire x entre 1 et N inclus. Puis tu parcours ton tableau pour trouver le x eme élément non marqué.
 
Autre posibilité : utiliser une liste/vecteur contenant tous les elements et supprimer les elements au fur et à mesure qu'ils sortent.

Reply

Marsh Posté le 08-01-2004 à 11:46:34    

En Belgique le Lotto c'est 6/40 et je pense pas qu'en France y soit beaucoup plus généreux...
 
Vois pas l'intêret d'optimiser ici, désolé...
 
48/49 pour moi c'est pas du Loto!


Message édité par avander le 08-01-2004 à 11:49:45
Reply

Marsh Posté le 08-01-2004 à 11:52:58    

super le réutilisabilité.

Reply

Marsh Posté le 08-01-2004 à 11:53:49    

jagstang a écrit :

super le réutilisabilité.  


 
oué bon, enculons pas les mouches non plus, la c'est un loto de TP, alors la réutilisabilité, hein ?

Reply

Marsh Posté le 08-01-2004 à 11:55:24    

ok ok...  
 

Code :
  1. cout << "resultats : 6, 13, 27, 29, 34, 40" ;


 
pis triés en plus

Reply

Marsh Posté le 08-01-2004 à 11:55:51    

ouais, bon, laisse tomber

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed