Page 1 sur 1
Random(Random(Random(40)))
Publié : lun. 21/mars/2011 21:02
par SPH
Executez ce code plusieurs fois et vous verrez qu'il est plus probable de ramasser de l'or plutot que des items.
Vous etes dans diablo2 et vous venez de tuer un boss. Lancez le code pour voir ce que vous attribue
Random(
Random(
Random(40))) :
Code : Tout sélectionner
Dim objet(10)
For objet=0 To 9
objet(objet)=Random(Random(Random(40)))
Next
For objet=1 To 10
If objet(objet)=0
Debug Str(Random(50)+2)+" or"
EndIf
If objet(objet)=1
Debug Str(Random(100)+2)+" or"
EndIf
If objet(objet)=2
Debug Str(Random(150)+2)+" or"
EndIf
If objet(objet)=3
Debug Str(Random(200)+2)+" or"
EndIf
If objet(objet)=4
Debug Str(Random(250)+2)+" or"
EndIf
If objet(objet)=5 Or objet(objet)>9
Debug Str(Random(300)+2)+" or"
EndIf
If objet(objet)=6
Debug "Une dague en argent niveau "+Str(Random(50)+10)+" Dégats "+Str(Random(20)+10)+"-"+Str(Random(20)+30)
EndIf
If objet(objet)=7
Debug "Une epee en argent niveau "+Str(Random(50)+13)+" Dégats "+Str(Random(20)+22)+"-"+Str(Random(20)+44)
EndIf
If objet(objet)=8
Debug "Un bouclier en or niveau "+Str(Random(50)+40)+" Dégats "+Str(Random(20)+40)+"-"+Str(Random(20)+70)
EndIf
If objet(objet)=9
Debug "Une rapierre en or niveau "+Str(Random(50)+50)+" Dégats "+Str(Random(20)+50)+"-"+Str(Random(20)+70)
EndIf
Next
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 9:39
par G-Rom
je vois que tu fait des
If objet(objet)=1
tu testes 10 valeurs à la suite , de 0 à 9 , soit dix possibilités.
mais objet() , a une valeur attribué bizarrement qui va de 0 à 40
objet(objet)=Random(Random(Random(40)))
D'ailleurs cela peut être réduis à un simple
random.
ajoute un randomseed en début de prog , et met un
random(10) pour la valeur de l'objet.
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 10:07
par SPH
G-Rom a écrit :objet(objet)=Random(Random(Random(40)))
D'ailleurs cela peut être réduis à un simple
random.
ajoute un randomseed en début de prog , et met un
random(10) pour la valeur de l'objet.
Non, tu n'as pas compris l'instruction.
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 10:45
par G-Rom
Random(Random(Random(40)))
En admettant que le
random le plus profond te renvois 40 , ce qui est probable.
& que le
Random() médian renvois lui aussi 40 , le
random() le moins profond à donc
aussi la possibilité de renvoyé 40.
Autant faire un
Random(10) si c'est ce que tu cherches à faire.
Code : Tout sélectionner
OK=#True
cnt.i=0
While OK
If Random(Random(Random(40))) = 40
OK = #False
Debug "Tu vois , ca arrive ! :"+Str(cnt)
EndIf
cnt+1
Wend
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 14:55
par SPH
G-Rom a écrit :Random(Random(Random(40)))
Autant faire un
Random(10) si c'est ce que tu cherches à faire.
Oui, je comprend pour le 10 a la place du 40
Mais
Random(10) n'est pas du tout pareil que
Random(
Random(
Random(10)))
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 15:44
par G-Rom
Mais Random(10) n'est pas du tout pareil que Random(Random(Random(10)))
L'intervalle reste la même , elle à plus tendance à aller vers une faible valeur , ce qui est logique.
si le
random le plus pronfond renvois admettons 5
le
random median devra choisir entre 0 & 5, & si il sort 2
l'intervalle qui reste pour le dernier
random est de 2 , d'ou les faibles valeurs.
il te sortira un nombre entre 0 & 2.
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 16:28
par G-Rom
Voici un code avec des probabilités :
Code : Tout sélectionner
Procedure.b Probability(percent.f)
pNorm.f = percent / 100
pProb.f = Random(100) / 100
If pNorm >= pProb
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Global cntOr,cntFer,cntArgent,cntBronze,cntZef
Procedure.s GiveItem()
If Probability(50)=#True
cntBronze+1
ProcedureReturn Str(Random(499)+1)+" de bronze"
EndIf
If Probability(20)=#True
cntArgent+1
ProcedureReturn Str(Random(499)+1)+" d'argent"
EndIf
If Probability(20)=#True
cntFer+1
ProcedureReturn Str(Random(499)+1)+" de fer blanc"
EndIf
If Probability(10)=#True
cntOr+1
ProcedureReturn Str(Random(499)+1)+" d'or"
EndIf
cntZef + 1
ProcedureReturn "du vent..."
EndProcedure
For i = 0 To 1000
Item$ = GiveItem()
Debug "Vous avez recu "+Item$
Next
Debug ""
Debug Str(cntOr) +":"+Str(cntFer) +":"+Str(cntArgent) +":"+Str(cntBronze) +":"+Str(cntZef)
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 17:13
par SPH
Ton code ne me parait pas du tout approprié pour mesurer les probabilités.
Voici un code bien plus explicite :
Code : Tout sélectionner
Debug ("Un seul Random :")
Dim cmb(9)
For i=1 To 10000
a=Random(9)
cmb(a)+1
Next
For i=0 To 9
Debug "Objet "+Str(i)+" : "+StrF(cmb(i)/100)+"%"
Next
Debug(" ")
Debug ("2 Random :")
Dim cmb(9)
For i=1 To 10000
a=Random(Random(9))
cmb(a)+1
Next
For i=0 To 9
Debug "Objet "+Str(i)+" : "+StrF(cmb(i)/100)+"%"
Next
Debug(" ")
Debug ("3 Random :")
Dim cmb(9)
For i=1 To 10000
a=Random(Random(Random(9)))
cmb(a)+1
Next
For i=0 To 9
Debug "Objet "+Str(i)+" : "+StrF(cmb(i)/100)+"%"
Next
Debug(" ")
Debug ("4 Random :")
Dim cmb(9)
For i=1 To 10000
a=Random(Random(Random(Random(9))))
cmb(a)+1
Next
For i=0 To 9
Debug "Objet "+Str(i)+" : "+StrF(cmb(i)/100)+"%"
Next
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 17:38
par Demivec
Ceci a les mêmes résultats.
Code : Tout sélectionner
Dim objet(10)
For objet=0 To 9
objet(objet) = Random(1000) ;Random(Random(Random(40)))
Next
For objet=1 To 10
Select objet(objet)
Case 0 To 2450 ;case 0 ; probabilités * 100, i.e. 24.5% = 2450
Debug Str(Random(50)+2)+" or"
Case 2451 To 3859 ;case 1 ;14.09%
Debug Str(Random(100)+2)+" or"
Case 3859 To 4862 ;case 2 ;10.03%
Debug Str(Random(150)+2)+" or"
Case 4862 To 5642 ;case 3 ;7.78%
Debug Str(Random(200)+2)+" or"
Case 5642 To 6264 ;case 4 ;6.22%
Debug Str(Random(250)+2)+" or"
Case 6264 To 6781 ;case 6 ;5.17%
Debug "Une dague en argent niveau "+Str(Random(50)+10)+" Dégats "+Str(Random(20)+10)+"-"+Str(Random(20)+30)
Case 6781 To 7214;case 7 ;4.33%
Debug "Une epee en argent niveau "+Str(Random(50)+13)+" Dégats "+Str(Random(20)+22)+"-"+Str(Random(20)+44)
Case 7214 To 7583;case 8 ;3.69%
Debug "Un bouclier en or niveau "+Str(Random(50)+40)+" Dégats "+Str(Random(20)+40)+"-"+Str(Random(20)+70)
Case 7583 To 7904;case 9 ;3.21%
Debug "Une rapierre en or niveau "+Str(Random(50)+50)+" Dégats "+Str(Random(20)+50)+"-"+Str(Random(20)+70)
Default ;case 5 or >9 ;20.98%
Debug Str(Random(300)+2)+" or"
EndSelect
Next
Re: Random(Random(Random(40)))
Publié : mar. 22/mars/2011 17:44
par SPH
Demivec a écrit :Ceci a les mêmes résultats.
Code : Tout sélectionner
Dim objet(10)
For objet=0 To 9
objet(objet) = Random(1000) ;Random(Random(Random(40)))
Next
For objet=1 To 10
Select objet(objet)
Case 0 To 2450 ;case 0 ; probabilités * 100, i.e. 24.5% = 2450
Debug Str(Random(50)+2)+" or"
Case 2451 To 3859 ;case 1 ;14.09%
Debug Str(Random(100)+2)+" or"
Case 3859 To 4862 ;case 2 ;10.03%
Debug Str(Random(150)+2)+" or"
Case 4862 To 5642 ;case 3 ;7.78%
Debug Str(Random(200)+2)+" or"
Case 5642 To 6264 ;case 4 ;6.22%
Debug Str(Random(250)+2)+" or"
Case 6264 To 6781 ;case 6 ;5.17%
Debug "Une dague en argent niveau "+Str(Random(50)+10)+" Dégats "+Str(Random(20)+10)+"-"+Str(Random(20)+30)
Case 6781 To 7214;case 7 ;4.33%
Debug "Une epee en argent niveau "+Str(Random(50)+13)+" Dégats "+Str(Random(20)+22)+"-"+Str(Random(20)+44)
Case 7214 To 7583;case 8 ;3.69%
Debug "Un bouclier en or niveau "+Str(Random(50)+40)+" Dégats "+Str(Random(20)+40)+"-"+Str(Random(20)+70)
Case 7583 To 7904;case 9 ;3.21%
Debug "Une rapierre en or niveau "+Str(Random(50)+50)+" Dégats "+Str(Random(20)+50)+"-"+Str(Random(20)+70)
Default ;case 5 or >9 ;20.98%
Debug Str(Random(300)+2)+" or"
EndSelect
Next
Tu dois avoir fait une erreur. C'est plutot ceci :
Code : Tout sélectionner
Dim objet(10)
For objet=0 To 9
objet(objet) = Random(8000) ;Random(Random(Random(40)))
Next
Mais oui, je comprend l'idee qui est de faire des sections de plus en plus courtes
Re: Random(Random(Random(40)))
Publié : mer. 23/mars/2011 0:12
par PAPIPP
Bonjour à tous
Random(100) est une fonction qui génère un nombre pseudo aléatoire
avec une probabilité identique pour chaque tirage entre 0 et 100
C’est un générateur d’une loi pseudo uniforme discrète.
Random(
random(100)) génère une loi pseudo géométrique mais pas une loi pseudo uniforme
Le prg suivant permet de créer une liste des différents
random
Code : Tout sélectionner
Structure RR
R.l
RR.l
RRR.l
RRRR.l
EndStructure
Dim tab.RR (100)
For i=0 To 10000
x=Random(100)
tab(x)\R+1
x=Random(Random(100))
tab(x)\RR+1
x=Random(Random(Random(100)))
tab(x)\RRR+1
x=Random(Random(Random(Random(100))))
tab(x)\RRRR+1
Next
For i =0 To 100
; Debug _n(i)+_n(tab(i)\r)+_n(tab(i)\rr)+_n(tab(i)\rrr)+_n(tab(i)\rrrr)
Debug Str(i)+" "+Chr(9)+" "+Str(tab(i)\r)+" "+Chr(9)+" "+Str(tab(i)\rr)+" "+Chr(9)+" "+Str(tab(i)\rrr)+" "+Chr(9)+" "+Str(tab(i)\rrrr)
Next
autre type de prg plus rapide mais de résultats identiques
Code : Tout sélectionner
Structure RR
R.l
RR.l
RRR.l
RRRR.l
EndStructure
Dim tab.RR(100)
For i=0 To 10000
x=Random(100)
tab(x)\R+1
x=Random(x)
tab(x)\RR+1
x=Random(x)
tab(x)\RRR+1
x=Random(x)
tab(x)\RRRR+1
Next
For i=0 To 100
; Debug _n(i)+_n(tab(i)\r)+_n(tab(i)\rr)+_n(tab(i)\rrr)+_n(tab(i)\rrrr)
Debug Str(i)+" "+Chr(9)+" "+Str(tab(i)\r)+" "+Chr(9)+" "+Str(tab(i)\rr)+" "+Chr(9)+" "+Str(tab(i)\rrr)+" "+Chr(9)+" "+Str(tab(i)\rrrr)
Next
La liste fourni par debug peut être utilisée directement dans excel pour être visualisée
Comme l’exemple le montre pour la colonne
random(100) en bleu
(10000 tirages entre 0 et 100 donnent une fréquence de 100 environ pour chaque nombre tiré)
et la colonne
random(
random(100)) en rouge de type géométrique.
http://dl.free.fr/nWX6Ed3VA
Sur l'axe des x de 0 à 100 les Nombres tirés avec
random(....
Sur l'axe des Y de 0 à 600 la fréquence de chaque tirage
@+
Re: Random(Random(Random(40)))
Publié : mer. 23/mars/2011 15:49
par Demivec
Code : Tout sélectionner
Dim objet(10)
For objet=0 To 9
objet(objet) = Random(10000) ;Random(Random(Random(40))) ; <= révision
Next
