Generer un nombre aléatoire à l'exception d'un ensemble d'entiers ?

Generer un nombre aléatoire à l'exception d'un ensemble d'entiers ? - C++ - Programmation

Marsh Posté le 31-08-2004 à 11:28:02    

Bonjour. :hello:
 
La recherche étant désactivée, je n'ai pas trouvé ce que je cherchait via google, alors je pose la question car je pense qu'appliquée à un entier cela ne doit pas être insurmontable... :)
 
Donc ce que je souhaiterais faire est de pouvoir disposer d'un ensemble d'entiers. (Donc des entiers sans doublons, auxquel je peux en rajouter, et dont je peux extraire ces entiers ci possible en ordre croissant.)
 
Grace à cet ensemble, je souhaiterais generer un nombre aléatoire entre deux bornes en excluant les éléments de cet ensemble de facon à ce qu'un nombre aléatoire donné ne tombe jamais deux fois. Et aussi qu'ensuite je puisse sauvegarder toutes les valeurs deja tombées afin qu'elles ne retombe pas de nouveau.
 
Je pense qu'on peut faire ca simplement via un tableau et quelques méthodes à l'aide de boucles scannant tout à chaque accès, mais comme il s'agit d'implementer ca dans un jeu, j'aimerais bien que ce soit rapide et que ca ne mette pas trois plombes afin de me trouver un entier qui n'est pas deja tombé... (Car la solution la plus simple serait de stocker ces entiers dans un tableau puis de generer les nombres aléatoires. De parcourir l'ensemble du tableau pour verifier si ce nombre et présent,(evenutllement on pourrait le trier + accès par recherche dichotomique) et s'il l'est de generer un autre nombre et ainsi de suite jusqu'à en avoir un OK. Seulement j'ai un peut peur qu'une fois qu'il n'y ait plus qu'une vingtaine de nombres de tester la fonction mette trois plombe à les trouver... :/) Ou alors je fait un bete tableau de bouléens correspondant au nombre de valzurs à trouver et j'affecte true si la valeur est deja tombée et ne dois plus l'etre, mais on aura surement le meme problème vers la fin et ca me parait pas très elegant ni performant... :/
 
Donc je pense qu'il y a une melleire solution bien plus efficace, et que commencer à coder un truc comme expliqué ci dessus risque d'être une véritable perte de temps... :/
 
Si vous avez des idées je suis preneur. :)
Mercÿte :jap:

Reply

Marsh Posté le 31-08-2004 à 11:28:02   

Reply

Marsh Posté le 31-08-2004 à 11:30:04    

tu prends ta séquence, et tu la mélanges, tu sors les éléments un par un. quand t'arrives au dernier, tu remélanges http://sgi.com/tech/stl/random_shuffle.html

Reply

Marsh Posté le 31-08-2004 à 11:33:47    

Mici je regarde, j'y avait pas pensé mais ca a l'air tout bete mais bien pensé :jap:

Reply

Marsh Posté le 02-09-2004 à 16:38:47    

:hello:
 
J'ai un peu de mal, je m'emmèle un peu les pinceaux avec le passage des paramètres au random shuffle... :/
 
En fait j'ai un tableau à deux dimension comme ceci :

Code :
  1. int m_iEnigSeq[NB_ENIG_MAX][NB_ENIG_CATS - 1];


Et j'aimerais pouvoir melanger les éléments de la première dimension.
 
Donc je pensais faire un truc tel que :

Code :
  1. for(int i = 0; i < (NB_ENIG_CATS - 1); i++)
  2.    std::random_shuffle(m_iEnigSeq[][i], m_iEnigSeq[][i] + iEnigSeqMax[i]);


Mais ca evidemment c'est pas possible en c++... :ange: Donner les indices [0][i] n'est pas possible non plus, et passer l'adresse de [0][i] fait travailler sur les valeurs des adresses, donc c'est pas tout à fait le but recherché... :ange:
 
En inversant les dimensions et utilisant m_iEnigSeq[i] ca marcherait pitètre, mais ca ne m'arrange pas vraiment de faire ca... :/ Je pense que la solution doit être toute bete mais j'ai beau parcourir les site parlant de ca, ils utilisent tous la classe vector quasiment... :(
 
Un ptit coup de pouce serait le bienvenu :)
Mercÿte :jap:


Message édité par Jesus Army le 02-09-2004 à 16:39:50
Reply

Marsh Posté le 02-09-2004 à 17:27:02    

Jesus Army a écrit :

:hello:
 
Donc je pensais faire un truc tel que :

Code :
  1. for(int i = 0; i < (NB_ENIG_CATS - 1); i++)
  2.    std::random_shuffle(m_iEnigSeq[][i], m_iEnigSeq[][i] + iEnigSeqMax[i]);


 


 
Si tu n'y arrives pas, ne te casse pas la tête avec les algos STL alors. (mais je pense que tu devrais quand même essayer d'utiliser vector dans l'absolu)..
 

Code :
  1. for(int i = 0; i < (NB_ENIG_CATS - 1); i++)
  2.      for (int j=0; j<NB_ENIG_MAX; ++j)
  3.        {
  4.           int pos = rand()*NB_ENIG_MAX/RAND_MAX;
  5.           // Et tu échanges simplement la valeur en position "pos" avec
  6.           // la valeur en position j.
  7.           int swap_value = m_iEnigSeq[j][i];
  8.           m_iEnigSeq[j][i] = m_iEnigSeq[pos][i];
  9.           m_iEnigSeq[pos][i] = swap _value;
  10.         }


Reply

Marsh Posté le 02-09-2004 à 17:37:21    

Oui il est vrai que je peux aussi melanger le tout à la mimine, je vais faire ca je pense en attendant de trouver la solution avec random_shuffle(). Merci :jap:

Reply

Marsh Posté le 03-09-2004 à 10:49:31    

Juste une question :ange:
 
Pourquoi

Code :
  1. rand()*NB_ENIG_MAX/RAND_MAX;


et non pas

Code :
  1. rand()%NB_ENIG_MAX;

tout simplement ? :)


Message édité par Jesus Army le 03-09-2004 à 10:49:57
Reply

Marsh Posté le 03-09-2004 à 10:50:51    

parce que (putain faut vraiment que je remette mon ancienne signature ?)

Reply

Marsh Posté le 03-09-2004 à 10:55:10    

ayan :O


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 10:59:29    

Tout ca [:dawak]
 
(tiens un gay [:cupra])

Reply

Marsh Posté le 03-09-2004 à 10:59:29   

Reply

Marsh Posté le 03-09-2004 à 11:11:31    

signature pas à jour, site perso dans les choux, question pas futé : tu cumules sale matrisk male


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 11:22:45    

Beurk :vomi:
 
Rien mettre à jour c'est ma facon à moi d'avoir l'esprit tranquile et de ne pas me dire que je passe mon temps sur hfr au boulot. [:cupra]
 
Pis j'en ai pas d'autre à mettre. :D Et ya pas si longtemps yavait encore la page de fin de GF... :D
 
(Pléonamse ton insulte au passage, sache qu'un matrisk c'est forcement un male :na: [:tinostar])

Reply

Marsh Posté le 03-09-2004 à 11:30:38    

l'important c'est pas que tu en sois convaincu, c'est que tes chefs s'en apercoivent pas :d
 
 
C'était dans le sens compagnon male de matrisk :o


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 11:38:41    

Le projet avance et je bosse quand meme donc je suppute que c'est bon... :D
 
Et heureusement que tu ne te rend pas compte de ce que tu dis parceque t'aurais deja tapissé la pièce où tu es de vomi... :/ :D
 
Et alors c'est quoi cette signature ? :o Tu nous fait le coup classique du geek solitaire et depressif ? [:tinostar]

Reply

Marsh Posté le 03-09-2004 à 11:48:54    

Le projet avance mais c pas forcément grace à toi :o
(tu fais koi komme stage/projet ?)
 
Je le suis, dépressif par confort, solitaire par obligation :d


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 11:52:15    

Jesus Army a écrit :

Juste une question :ange:
 
Pourquoi

Code :
  1. rand()*NB_ENIG_MAX/RAND_MAX;


et non pas

Code :
  1. rand()%NB_ENIG_MAX;

tout simplement ? :)


 
Effectivement, ça va plus vite.  
 
Mais ça dépend des valeurs. Par exemple, si ENIG_MAX == 20, et RAND_MAX == 30, alors tu as 2 fois plus de chances d'avoir un nombre entre  
0 et 9 qu'entre 10 et 19. Enfin, tu vois le truc.
 
Ca me rappelle le vieux rand de je-ne-sais-plus-quel-compilo qui donnait tour à tour un nombre pair, puis impair. C'était pas super de faire un modulo pour obtenir un 0 ou un 1 :)
 
Bref, en théorie c'est mal, en pratique, on s'en tape.

Reply

Marsh Posté le 03-09-2004 à 12:07:57    

Lam's a écrit :

Effectivement, ça va plus vite.  
 
Mais ça dépend des valeurs. Par exemple, si ENIG_MAX == 20, et RAND_MAX == 30, alors tu as 2 fois plus de chances d'avoir un nombre entre  
0 et 9 qu'entre 10 et 19. Enfin, tu vois le truc.
 
Ca me rappelle le vieux rand de je-ne-sais-plus-quel-compilo qui donnait tour à tour un nombre pair, puis impair. C'était pas super de faire un modulo pour obtenir un 0 ou un 1 :)
 
Bref, en théorie c'est mal, en pratique, on s'en tape.


D'accord, je vais faire comme ca alors, je pense que ca devrait malgré tout suffire pour ce que je dois en faire. :jap:
 
Et je me coucherais moins bete ce soir :D :jap:

Reply

Marsh Posté le 03-09-2004 à 12:09:08    

Dion a écrit :

Le projet avance mais c pas forcément grace à toi :o
(tu fais koi komme stage/projet ?)
 
Je le suis, dépressif par confort, solitaire par obligation :d


Si forcement parceque je suis tout seul sur le projet... [:boidleau] (C'est un jeu pour "casual gamers" :D)
 
Ca c'est du confort la depression, et la solitude fallait pas prendre cettre branche comme etudes [:tinostar]


Message édité par Jesus Army le 03-09-2004 à 12:09:35
Reply

Marsh Posté le 03-09-2004 à 12:15:24    

oui, je déprime comme ça je me pose pas de questions :o
 
Ca vient même pas de mes études :D
 


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 12:19:08    

"Solitude par obligation" ca serait pitètre pas le cas si t'avais fait une fac de lettres non ? :whistle:

Reply

Marsh Posté le 03-09-2004 à 13:20:45    

Obligation professionnel : j'ai pas le tps de m'occuper d'une femelle :o
 
 
Pkoi tu veux exclure des entiers au fait ? :whistle:


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 13:38:21    

A ce point occupé ? :D :D
 
Sinon c'est parceque j'ai une serie d'enigmes (6000 de prévues normalement) que chaque joueur doit avoir une et une seule fois, sauf s'il les a deja toutes affichées. Normalement c'est bon, amarche. :)

Reply

Marsh Posté le 03-09-2004 à 13:40:11    

j'ai autre chose à foutre de mes week end :o
 
Et donc ?


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 13:48:44    

Faut faire attention à pas trop se geekationner quand meme... :D
 
Et donc quoi ? [:tinostar]

Reply

Marsh Posté le 03-09-2004 à 13:54:36    

Je vois tjs pas l'interet :o


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 14:01:21    

Beh de pouvoir piocher une enigme de manière aléatoire dans mon ptit fichier contenant toutes les enigmes, en sachant que pour ce joueur elle n'est pas encore sortie...

Reply

Marsh Posté le 03-09-2004 à 14:03:01    

J'avais pas lu tout le premier post faut dire [:itm]


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 14:06:29    

T'aime pas quand c'est trop long c'est ca ? [:boidleau]

Reply

Marsh Posté le 03-09-2004 à 14:14:56    

j'ai vu C++, comme j'en ai jamais fait j'ai laisser tomber
 
puis bon, tu fais un gros paragraphe tout pas lisible, beurk :o
 
Puis je travaille moi :o


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 14:49:47    

Tant que je reste sur la meme idée ou explication je change pas de paragraphe... [:spamafote] :D
 
T'es en stage ? Boulot d'été ? Boulot à mi temps ?

Reply

Marsh Posté le 03-09-2004 à 15:26:53    

tu as des idées maintenant ?
 
stage, 6 mois 1juiller 31 décembre


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 03-09-2004 à 15:46:16    

Ué plein ! :p
 
Deja un stage de 6 mois ?
 
Je finis le miens dans 2 semaines moi, et après j'enchaine directement sur les cours... :/ Pas de vacances cette année... :'(


Message édité par Jesus Army le 03-09-2004 à 15:46:36
Reply

Marsh Posté le 03-09-2004 à 20:51:51    

ouep, mais pas de vacances :d
 
T'es pas en derniere annee sale loque ?

Reply

Marsh Posté le 06-09-2004 à 10:37:10    

Uip d'ici deux semaines. :D
 
PAr contre pfff, j'ai la flemme rien que de penser à faire mon rapport de stage... :/

Reply

Marsh Posté le 06-09-2004 à 10:53:02    

t'as un stage en avant dernière année ? elle est bizarre ton ecole :O


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 06-09-2004 à 11:03:36    

J'ai un stage tous les ans [:sisicaivrai] (Donc les grandes vacances je connais plus... :'()

Reply

Marsh Posté le 06-09-2004 à 13:46:31    

Taz a écrit :

tu prends ta séquence, et tu la mélanges, tu sors les éléments un par un. quand t'arrives au dernier, tu remélanges http://sgi.com/tech/stl/random_shuffle.html


 
J'en profite pour poser une petite question sur le random_shuffle (desolé pour la polution de topik):
Comment on fait pour intialiser le tirage aleatoire de random_shuffle ?
je cherche un equivalent de srand en quelque sorte.
 
 

Reply

Marsh Posté le 06-09-2004 à 15:13:27    

ben tu prends le 3ème argument de random_shuffle

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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