Nombre Secret `(Probleme de Proba...)

albert0 Messages postés 249 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 9 août 2008 - 26 oct. 2005 à 22:02
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 - 28 oct. 2005 à 01:00
Bonsoir,



Voila, je suis en train de faire un algorithme, le but est est de
trouve un "Nombre secret" ce nombre secret est generé par un Random:



Float: Rand: Random()



Random donne un nombre (float) compris entre 0 et 1



les borne pour trouver le chiffre son demandé au joueur (genre de 0 à 100..)



Pour l'example on va dire de : 0 à 10



Le probleme maintenant c'est qu'il faut que CHAQUE CHIFFRE EST LA MEME PROBABILITE D'ETRE CHOISIT...



la premiere chose qui me vien a l'esprit c'est de faire:



NbSecret = (Integer)Rand * 10



donc la j'aurai un chiffre qui se trouvera entre 0 et 10 (Compris)



mais le probleme c'est que les borne (0 et 10) on 2fois moi de chance d'etre choisi...



j'ai donc fait un ca:



NbSecret := ((10 +1)*Rand) mod (10 + 1));



avec ceci chaque chiffre a la meme probabilité detre choisit (car la on
a agrandi la borne (de 10 a 11) et le mod(10+1) agrandi la borne (0)



Mais je n'ai pas le droit d'utilise Mod,

Il me faut donc une autre Equation..



et la je bloque :(



si quelqu'un pourrai me donné quelque indice?



d'avance merci

7 réponses

cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
26 oct. 2005 à 23:31
salut,

pas besoin de mod dans ton truc ...

NbSecret = (int) 11*Rand();

sachant que Rand() a une probabilité 0 de retourner 1., ton nombre est bien entre 0 et 10.

si pas de bol ca vaut 1, tu le rejettes et le retires:

int NbSecret = 11;

while (NbSecret >= 11)

{

NbSecret = (int) 11*Rand();

}



et voila.. Le cast en int prend la partie entière du réel qui suit.



a+
0
albert0 Messages postés 249 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 9 août 2008
27 oct. 2005 à 09:40
Merci d'avoir répondu :)



mais maintenant si je fait ca, le 0a deux fois moi de chance d'etre chois que les autre



le seul indice que j'ai c'est qu'il faut placer quelque par "0.5"
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
27 oct. 2005 à 10:59
mais non, 0 a autant de chance de sortir que les autres... la partie
entiere ne déforme pas le decoupement de 0..1 en 11 parties egales!



ca donne 0, si ton Rand() est à la base compris entre 0 et 1./11.

ca donne 1 si c'est compris entre 1./11 et 2./11

etc.

chaque nombre a un proba 1/11 de sortir suivant l'intervalle initial dans lequel tombe le Rand().



bref
0
albert0 Messages postés 249 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 9 août 2008
27 oct. 2005 à 20:12
hmmm nan regarde:

dison interval de 0 à 2 (compris)



0 // 0.1 // 0.2 etc... jusqu'a 2



de 0 à 0.4 = 0 ( la y a en 5)

de 0.5 à 1.4 = 1 (la 10)

de 1.5 à 2 = 2 (et la 6)



donc la 2 fois moi de chance sur le bord...



si maintenant on agrandi en faisait + 1



de 0 à 0.4 = 0 ( la y a en 5)


de 0.5 à 1.4 = 1 (la 10)


de 1.5 à 2.4 = 2 (et la 10)

de 2.5 à 3 = 3 (et la 6)



donc avec ton truc si c'est plus grand que 3, on retire?, ca ne change
pas la donne, un autre chiffre sera tiréé mais les bord auron TOUJOUS
DEUX FOIS MOIN D ECHANCE d etre choisit :)



en faite le rem sert en GROS a mettre tout les '3' dans les 0... (car 3 mod 3 = 0..)



mais avec Mod j'ai pas le droit...

donc on peut faire if NbSecret 3 -> nbSecret 0



mais c'est pas tres beau...



jje doit trouver une formule



vala
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vladisback Messages postés 61 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 5 août 2008
27 oct. 2005 à 21:29
salut, excuse moi mais je crois que tu te trompe et que cosmobob a raison:

quand tu fais:
NbSecret = (Integer)Rand * 10

ça ne fait pas un arrondi mais une troncation puisque tu prend la partie entiére

0 a 0.999 =0
1 a 1.999 =1

donc il y a bien le meme nobre de chance...

maintenant si tu pense que je me trompe oublie ce que j'ai dis...
++
0
albert0 Messages postés 249 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 9 août 2008
27 oct. 2005 à 23:30
erf, jme excuse, j'ai oublié de dire que



en ADA:

Integer(..) arondissait et ne tronquait pas :(



donc 1,5 -> 2





mais effectivement si il tronquait vous aviez raisons !
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
28 oct. 2005 à 01:00
lol on est sur cppfrance, pas sur un forum lié à l'ada

pour la partie entiere, cherche si ya pas une fonction qui s'appelle floor ...
0
Rejoignez-nous