Random(Random(Random(40)))

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Random(Random(Random(40)))

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Random(Random(Random(40)))

Message 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.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Random(Random(Random(40)))

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Random(Random(Random(40)))

Message 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
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Random(Random(Random(40)))

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Random(Random(Random(40)))

Message 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.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Random(Random(Random(40)))

Message 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)
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Random(Random(Random(40)))

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Random(Random(Random(40)))

Message 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
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Random(Random(Random(40)))

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Random(Random(Random(40)))

Message 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
@+
Dernière modification par PAPIPP le jeu. 24/mars/2011 8:19, modifié 1 fois.
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Random(Random(Random(40)))

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