Page 1 sur 2
Random() et RandomSeed() = valeurs aléatoires ?
Publié : lun. 20/sept./2004 16:16
par Oliv
regardez le code
Code : Tout sélectionner
Zero.l : Un.l : Deux.l : Trois.l : Quatre.l
For i = 1 To 100000
Select Random(4)
Case 0
Zero + 1
Case 1
Un + 1
Case 2
Deux + 1
Case 3
Trois + 1
Default
Quatre + 1
EndSelect
RandomSeed(Random(1000))
Next i
Debug Zero
Debug Un
Debug Deux
Debug Trois
Debug Quatre
Chez moi, il y a très souvent 33XXX ou 36XXX pour le zéro, et pareil pour le un. Quelqu'un pourrait-il m'expliquer comment peut-on générer une valeur aléatoire sur un PC ? merci

Publié : lun. 20/sept./2004 17:23
par Le Soldat Inconnu
ben comme ça :
Code : Tout sélectionner
Zero.l : Un.l : Deux.l : Trois.l : Quatre.l
For i = 1 To 100000
Select Random(4)
Case 0
Zero + 1
Case 1
Un + 1
Case 2
Deux + 1
Case 3
Trois + 1
Default
Quatre + 1
EndSelect
Next i
Debug Zero
Debug Un
Debug Deux
Debug Trois
Debug Quatre
j'ai enlevé le randomseed() qui ne sert qu'à initialiser la série aléatoire en fonction d'une valeur afin de toujours avoir la même série de nombre aléatoire pour faire des test par exemple
et la, on a bien des valeurs qui sont toutes proches de 20000 (soit 100000 / 5 vu qu'il y a 5 possibilités)
Publié : lun. 20/sept./2004 19:05
par Oliv
bah justement là c'est pire puisque l'on a une répartition égale à chaque fois. Au moins, avec RandomSeed() la répartition change un peu
Publié : lun. 20/sept./2004 19:27
par nico
J'ai l'impression que la fonction s'arrange pour que les numéros sortis s'étalent plus ou moins également sur le nombre de valeurs possibles, elle éviterait ainsi des écarts trop importants.

Publié : lun. 20/sept./2004 21:34
par Oliv
Peut-être justement je voudrais savoir. si Fred pouvais nous éclairer
Publié : lun. 20/sept./2004 22:15
par Le Soldat Inconnu
il est normal d'avoir une répartition égale !
sinon, cela signifirai que la loi aléatoire n'est pas uniforme.
si on étend ton test vers l'infini, on doit avoir exactement les mêmes nombres d'apparition de chaque chiffre.
toi, avec ton premier code, tu fais un "dé pipé de tricheur". pour te donner un exemple, un dé à 5 faces qui donnerait bien plus souvent des 0 et 1 que les autres chiffres.
alors que normalement, on a la même probabilité de faire un 0, un 1, un 2, etc...
donc on doit avoir une répartition des valeurs égales.
en clair, ton code donne une valeur aléatoire faussée car tu obtients un plus grand pourcentage de 0 et de 1 ce qui n'est pas logique du tout.
c'est de la proba, 1 chance sur 5 de tiré un 0, 1 chance sur 5 de tiré un 1, 1 chance sur 5 de tiré un 2, etc...
donc sur 100000 essai, on doit obtenir 100000 * 1 / 5 = 20000 fois la valeur 0 (avec 100000 le nombre d'essai et 1/5 la probabilité d'avoir un 0), on doit obtenir 100000 * 1 / 5 = 20000 fois la valeur 1, etc ...
tu noteras que c'est à peu de chose près ce que j'obtiens
et pas 1.5 chance sur 5 de tiré un 0, 1.5 chance sur 5 de tiré un 1, 1 chance sur 5 de tiré un 2, 1 chance sur 5 de tiré un 3, 0.5 chance sur 5 de tiré un 4 et 0.5 chance sur 5 de tiré un 5 comme donne ton code.
Tu comprends ce que je veux dire ?
Publié : mar. 21/sept./2004 6:42
par Oliv
Oui je comprends, mais justement, je voudrais quelquechose sans cette loi : est-ce possible ?
Publié : mar. 21/sept./2004 9:07
par Backup
essaye ça !!!
a relancer plusieur fois (au moins 5) pour comparer !
Code : Tout sélectionner
Zero.l : un.l : deux.l : trois.l : quatre.l
For i = 1 To 100000
Select Random(4)
Case 0
Zero + 1
Case 1
un + 1
Case 2
deux + 1
Case 3
trois + 1
Default
quatre + 1
EndSelect
RandomSeed(Random(Random(1000))) ; <---- la j'ai modifié !!
Next i
Debug Zero
Debug un
Debug deux
Debug trois
Debug quatre
Publié : mar. 21/sept./2004 10:02
par Le Soldat Inconnu
Dobro > tu écoutes ce que dis
toi tu triches, c'est pas mathématiquement correct
Oliv > qu'est ce que tu veux comme loi ?
pour la modifier, c'est simple. on peut apparenter la fonction random à une droite d'équation "y=x"
pour obtenir une autre loi, il suffit de mofifier la courbe, par exemple "y=x²" pour avoir plus de valeur proche de 0
Exemple :
Code : Tout sélectionner
Zero.l : un.l : deux.l : trois.l : quatre.l
For i = 1 To 100000
Valeur = Int(Pow(Random(40), 2) / (40 * 10) + 0.5) ; le 0.5 sert à arrondir la valeur
; On prend une valeur plus grande que 4 par exemple 40 et on divise par la suite par 10 ne pas avoir de problème de précision
; on divise également par la valeur 40 car 40² donne 1600 or on veut varier de 0 à 4. donc 40²/40 = 40, la on varie de 0 à 40, ensuite, il suffit de diviser par 10
Select Valeur
Case 0
Zero + 1
Case 1
un + 1
Case 2
deux + 1
Case 3
trois + 1
Default
quatre + 1
EndSelect
Next i
Debug Zero
Debug un
Debug deux
Debug trois
Debug quatre
Donc pour avoir la loi que tu souhaites, il suffit de trouver l'équation qui y correspond et de remplacer le x dans l'équation par un Random.
Publié : mar. 21/sept./2004 17:26
par Oliv
@Dobro : Oui voilà

merci
@Le Soldat Inconnu : C'estce que dobro a fait que je voulais, car même si je connais la loi de probabilité, je voullais faire en sorte de ne pas avoir
1 chance sur 5 de tiré un 0, 1 chance sur 5 de tiré un 1, 1 chance sur 5 de tiré un 2, etc...
donc sur 100000 essai, on doit obtenir 100000 * 1 / 5 = 20000 fois la valeur 0
Pis je une petite question qui n'a que très peut rapport : comment purebasic fait-il un random ?
Publié : mar. 21/sept./2004 17:37
par Le Soldat Inconnu
C'est pour faire quoi, Oliv ? par curiosité
Publié : mar. 21/sept./2004 17:44
par Oliv
Pour faire un jeu de yam's (il y a d'autres noms mais je ne les connais pas) et pour changer (et embêter le joueur) je voulais changer un peu d'une chance sur 6 d'avoir un chiffre, mais bon, en fait je sais pas si ça casserait pas un peu le jeu

. Enfin merci de vos réponses, et si vous savez comment Purebasic fait, ne vous genez pas

Publié : mar. 21/sept./2004 20:35
par filperj
Pis je une petite question qui n'a que très peut rapport : comment purebasic fait-il un random ?
Je ne sais pas quelle méthode utilise PB, mais voici l'adaptation d'un code que j'avais piqué je sais plus où sur le web (à quelqu'un qui avouait l'avoir piqué à quelqu'un qui...)
C'est simple et ça a l'air de bien marcher (moi j'aime bien quand il faut pas grand-chose pour que ça marche^^)
Code : Tout sélectionner
#auhasard_incrementeur = $269EC3
#auhasard_multiplicateur = $343FD
Global pepin_hasardeux.long
Procedure.l alea_jacta_est(maximum.l)
pepin_hasardeux\l=pepin_hasardeux\l*#auhasard_incrementeur+#auhasard_multiplicateur
ProcedureReturn (((pepin_hasardeux\l>>8)&$ffffff)|((pepin_hasardeux\l<<24)&$7f000000))%(maximum+1)
EndProcedure
pepin_hasardeux\l=ElapsedMilliseconds()
For n=1 To 1000
nouveau=alea_jacta_est(2000)
Debug nouveau
Total+nouveau
Next
Debug "Moyenne:"
Debug Total/1000
Par contre je ne sais pas pourquoi il faut donner ces valeurs-là à incrementeur et multiplicateur... Une histoire de maths sans doute...
Publié : mar. 21/sept./2004 20:40
par Thyphoon
sinon tu peu aussi prendre une valeur humaine que tu calcul je m'explique tu prends le temps que s'ecoule entre un moment t et le moment ou le joueur réagit et ensuite selon ce que tu veux comme chiffre tu prend que les unités de se chiffre et un produit en croix pour n'avoir le chiffre qu'entre 1 et 6 ou autre... C'est ce que j'ai trouvé de plus alléatoire !
Dans un jeu que j'avais programmé je prenais plein de variabel comme ça
T1: temps entre le debut du programme et le moment ou le joueur bougeait la souris
T2 : le temp en milliseconde actuel
etc...
Voilà

)
Publié : mar. 21/sept./2004 20:50
par Oliv
Merci filperj, c'est sympa ce code

, bonne idée aussi Thyphoon, avec ça si il y en a qui me sortent des yams.....
