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 :D

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 ! :D

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 :lol:
toi tu triches, c'est pas mathématiquement correct :wink:

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à :D :D :D merci :D
@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 :cry: . Enfin merci de vos réponses, et si vous savez comment Purebasic fait, ne vous genez pas :P

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à :o)

Publié : mar. 21/sept./2004 20:50
par Oliv
Merci filperj, c'est sympa ce code :D , bonne idée aussi Thyphoon, avec ça si il y en a qui me sortent des yams..... :lol: