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
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)]
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.
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)]
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
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
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)]
@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 ?
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
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^^)
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à )