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
Image

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