Un tirage du LOTO sans 2 fois le même numéro ! - C - Programmation
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
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 ?
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
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.
Marsh Posté le 07-01-2004 à 21:39:15
ben comme tu melanges des cartes quand t'es un peu polio des mains
Code :
|
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
manque <cstdlib>
<ctime>
et toujours : allez voir chez Boost !
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 ? |
1/si mais on s'en fout
2/les sous cat deconnent je crois
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
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 ?
Marsh Posté le 07-01-2004 à 22:03:21
voire même std::random_shuffle
http://sgi.com/tech/stl/random_shuffle.html
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]<<" ";
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]
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.
Marsh Posté le 07-01-2004 à 22:08:44
taz a écrit : 1) parce que tu fais un dépassement |
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" ??
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.
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".
Marsh Posté le 07-01-2004 à 22:13:34
ReplyMarsh 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
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.
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.
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
Marsh Posté le 07-01-2004 à 22:21:00
ben tu fais une petite recherche, et tu vois 26 bons usages de rand()
Marsh Posté le 07-01-2004 à 22:24:42
Parfait, merci beaucoup.
Bon ben je vais lire mon Stroustrup et mon Oreilly, ça me sera peut être utile à voir ce qu'est vraiment le C++.
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
Pourqoi personne a tilisé cette solution ?
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. |
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.
Marsh Posté le 08-01-2004 à 11:14:04
ReplyMarsh 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 :-))
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. |
parce que si tu dois tirer 48 numéros parmi 49, les derniers numéros risquent de faire longs...
c'est toi le troll !
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.
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!
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 ?
Marsh Posté le 08-01-2004 à 11:55:24
ok ok...
Code :
|
pis triés en plus
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 :
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 !