Random() et RandomSeed() = valeurs aléatoires ?

Sujets variés concernant le développement en PureBasic
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Random() et RandomSeed() = valeurs aléatoires ?

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.

:)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Peut-être justement je voudrais savoir. si Fred pouvais nous éclairer
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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 ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Oui je comprends, mais justement, je voudrais quelquechose sans cette loi : est-ce possible ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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 ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

C'est pour faire quoi, Oliv ? par curiosité
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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...
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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:
Répondre