Helkanen
Messages postés54Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention 9 juin 2004 30 oct. 2003 à 14:16
resalut !
ça y est !
j'ai essayé avec un GetTickCount (même plusieurs) et j'arrive à faire qqchose d'aléatoire, malgré quelques failles de temps en temps...
voilà, j'ai fait un truc de barbare, mais j'ai essayé et la moyenne varie entre 4.8 et 5.2 sur quelques lancers.
et voici des résultats :
à chaque fois que tu réessayeras, ça changera complètement.
tu initialises tes valeurs de a et de b (presque) aléatoirement :
b = GetTickCount Mod &H1000 + 1 'un nombre aléatoire entre 1 et 32000 (256*256)
a = GetTickCount Mod &H10 + 1 'un nombre aléatoire entre 1 et 10
ensuite, tu changes un peu ton code:
If b <= 0 Then
b = GetTickCount Mod &H1000 + 1 'max 32000 et des poussières
Else
b = b - 1
End If
'pas de 0 si possible, alors :
If b <0 Then b 5547 '5547 pris au hasard
et :
If a >= 17 Then
a = GetTickCount Mod &HF + 1 'max 17
Else
a = a + 1
End If
'et comme on sait jamais, on préfère ne pas avoir de 0, donc :
If a <0 Then a 94 '94 pris au hasard
là, je prends pas directement le premier ou le deuxième chiffre parce qu'en prenant le premier chiffre, on n'aura jamais de valeur entre 0 et 0.1, et en prenant le deuxième, on trouve souvent les mêmes valeurs, le 3eme chiffre est donc le meilleur...
je fais pareil avec b
et pour calculer la moyenne, qui me permet de vérifier mes dires :
pour l'optimisation, même si je ne fais pas grand chose, tu devrais penser à mettre des valeurs plus petites dans tes intervalles des Timer (genre 5,7,11), virer le Timer4 et virer les affichages
mets un log de tes valeurs si tu veux
comme ça ça va bcp plus vite ! (même si c'est toujours pas génial...)
bonne prog, et adapte ça vite fait en une bonne fonction...
Helkanen
ps: désolé je t'ai maché le travail...
Helkanen
Messages postés54Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention 9 juin 2004 30 oct. 2003 à 12:11
ça serait pas mieux déjà avec un gettickcount ?
Public Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
et tu fais :
Dim rndStart as Long
rndStart = GetTickCount()
et pis là tu te débrouilles comme tu sais le faire
ça te donne au millième de seconde pres l'heure de l'ordi... donc y'a peu de chances que tu lances ton prog exactement au même moment !
d'ailleurs, je me trompe peut-etre, mais il me semble que Randomize qui initie la fonction Rnd utilise l'heure de l'ordi, genre gettickcount...
et comme te le fait remarquer orisa, c'est pas génial de l'aléatoire comme ça, ça fait une boucle beaucoup trop courte...
utilise des long, reprend l'heure apres un délai généré aléatoirement (par ton algo)... à mon avis l'effet aléatoire sera beaucoup plus puissant...
en tout cas, ça vient d'une bonne idée...
allez bonne prog...
Helkanen
cs_orisa
Messages postés38Date d'inscriptionlundi 18 mars 2002StatutMembreDernière intervention29 octobre 2003 29 oct. 2003 à 21:34
Juste une remarque. ça ne génère pas un nombre aléatoire !
et d'une les résultats sont totalement prévisible,
et de deux le cycle de retour des mêmes valeurs est trop petite.
Toutes les 18 valeurs générés on tombe sur la même. (seul la toute première diffère : 0,5 le premier cycle pour 0,43808 les cycles suivants) bref on a :
30 oct. 2003 à 14:56
si tu veux aller le voir...
http://www.vbfrance.com/code.aspx?ID=17537
ps : merci pour l'idée...
30 oct. 2003 à 14:16
ça y est !
j'ai essayé avec un GetTickCount (même plusieurs) et j'arrive à faire qqchose d'aléatoire, malgré quelques failles de temps en temps...
voilà, j'ai fait un truc de barbare, mais j'ai essayé et la moyenne varie entre 4.8 et 5.2 sur quelques lancers.
et voici des résultats :
0,592919384214007
0,728013871569369
0,415835657253047
0,254576433656851
0,216132337134248
0,593392628136009
0,801554434255433
0,380002726033585
0,381821105541345
0,313917576199207
0,347184199275632
0,447528415401571
0,859452924190291
0,076951145611089
0,565592164754285
0,74968771803407
0,162219816201855
0,510923820725132
0,678922483040097
0,919128753481067
0,615590002452243
0,39652767132222
0,233253511767732
0,414736072037083
0,762541046236931
0,250933772821125
0,777506288168624
0,637384528649925
0,191478528263151
0,371406440967236
0,471284900257501
0,540306135154584
0,540306135154584
0,407866138814537
0,562914816330974
0,586529129874961
0,416411469392262
0,232748584058229
0,502156203864129
0,241387604951361
0,784314240221022
0,692151765851463
0,575053523810348
0,320013331864923
0,429216113700395
0,449977038179524
0,388854125896103
0,527392631391049
0,458337568587957
0,449043141145228
0,484743533918321
0,344055410941856
0,577102765217628
0,569692407057047
0,355397688968054
0,545626806109503
0,769209016133948
0,690458335671025
0,703710028206128
0,132453190178207
à chaque fois que tu réessayeras, ça changera complètement.
tu initialises tes valeurs de a et de b (presque) aléatoirement :
b = GetTickCount Mod &H1000 + 1 'un nombre aléatoire entre 1 et 32000 (256*256)
a = GetTickCount Mod &H10 + 1 'un nombre aléatoire entre 1 et 10
ensuite, tu changes un peu ton code:
If b <= 0 Then
b = GetTickCount Mod &H1000 + 1 'max 32000 et des poussières
Else
b = b - 1
End If
'pas de 0 si possible, alors :
If b <0 Then b 5547 '5547 pris au hasard
et :
If a >= 17 Then
a = GetTickCount Mod &HF + 1 'max 17
Else
a = a + 1
End If
'et comme on sait jamais, on préfère ne pas avoir de 0, donc :
If a <0 Then a 94 '94 pris au hasard
'puis :
While alea1 > 100
alea1 = alea1 / 10
Wend
alea1 = alea1 - Int(alea1)
là, je prends pas directement le premier ou le deuxième chiffre parce qu'en prenant le premier chiffre, on n'aura jamais de valeur entre 0 et 0.1, et en prenant le deuxième, on trouve souvent les mêmes valeurs, le 3eme chiffre est donc le meilleur...
je fais pareil avec b
et pour calculer la moyenne, qui me permet de vérifier mes dires :
alea = (alea1 + alea2) / 2
nbLancers = nbLancers + 1
Moyenne = Moyenne + (alea - Moyenne) / nbLancers
voilà
pour l'optimisation, même si je ne fais pas grand chose, tu devrais penser à mettre des valeurs plus petites dans tes intervalles des Timer (genre 5,7,11), virer le Timer4 et virer les affichages
mets un log de tes valeurs si tu veux
strLog = strLog & vbCrLf & Format(alea, "0.###############")
comme ça ça va bcp plus vite ! (même si c'est toujours pas génial...)
bonne prog, et adapte ça vite fait en une bonne fonction...
Helkanen
ps: désolé je t'ai maché le travail...
30 oct. 2003 à 12:11
Public Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
et tu fais :
Dim rndStart as Long
rndStart = GetTickCount()
et pis là tu te débrouilles comme tu sais le faire
ça te donne au millième de seconde pres l'heure de l'ordi... donc y'a peu de chances que tu lances ton prog exactement au même moment !
d'ailleurs, je me trompe peut-etre, mais il me semble que Randomize qui initie la fonction Rnd utilise l'heure de l'ordi, genre gettickcount...
et comme te le fait remarquer orisa, c'est pas génial de l'aléatoire comme ça, ça fait une boucle beaucoup trop courte...
utilise des long, reprend l'heure apres un délai généré aléatoirement (par ton algo)... à mon avis l'effet aléatoire sera beaucoup plus puissant...
en tout cas, ça vient d'une bonne idée...
allez bonne prog...
Helkanen
29 oct. 2003 à 21:34
et d'une les résultats sont totalement prévisible,
et de deux le cycle de retour des mêmes valeurs est trop petite.
Toutes les 18 valeurs générés on tombe sur la même. (seul la toute première diffère : 0,5 le premier cycle pour 0,43808 les cycles suivants) bref on a :
0,43808 (ou 0,5la première fois)
0,281952256595828
0,526867009158683
0,61628125
0,122524513334208
0,655070633440572
0,35211862769184
0,567619479797542
0,598313525237776
0,28
0,462915
0,2075634720138
0,70258035422382
0,178722688326019
0,256195344792982
0,222657488355328
0,4319634532557
0,64210854715202
0,43808
0,281952256595828
0,526867009158683
0,61628125
...
voila voila, désolé :)
29 oct. 2003 à 19:38
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.