Générateur aléatoire sans rnd - avec gettickcount

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 198 fois - Téléchargée 31 fois

Contenu du snippet

Ben...
en fait je suis tombé sur une source très récente qui annonçait :
PORJET GALEA (GENRATEUR DE NOMBRE ALEATOIRE!!!! SANS RND!)
(vous pouvez chercher)
et en fait ça marchait pas bien son truc.
alors j'ai fait un bidule (ouéouéoué, truc bidule) petit à petit en changeant son code, et maintenant, on a un générateur de nombre aléatoire à peu près correct dont la moyenne sur 10000 lancers varie entre 0.499 et 0.500

Source / Exemple :


Dim a As Long
Dim b As Long
'variant est plus gros que Long, Double ou Currency et facile à manier...
Dim alea1 As Variant
Dim alea2 As Variant
Dim alea  As Variant

'renvoie l'heure système à la ms près sous forme de Long
Private Declare Function GetTickCount Lib "kernel32" () As Long

'à invoquer impérativement avant de "randomizer"
Public Function initRnd()
    a = GetTickCount() Mod &HF + 1
    b = GetTickCount() Mod &H1000 + 1
End Function

'la fonction d'appel de "randomisation"
Public Function getRnd() As Variant
    
    'b
    If b <= 0 Then
        b = GetTickCount Mod &H1000 + 1
    Else
        b = b - 1
    End If
    If b <= 0 Then b = 5547
    
    'a
    If a >= 17 Then
        a = GetTickCount Mod &HF + 1 'max 17
    Else
        a = a + 1
    End If
    If a <= 0 Then a = 11 'pris au "hasard"
    
    'alea1
    alea1 = b ^ a * Sqr(b / a + 2) ^ 3
    While alea1 > 100
        alea1 = alea1 / 10
    Wend
    alea1 = alea1 - Int(alea1)
    
    'en fait, ici je ne prends pas le deuxième chiffre de alea1 car il est trop souvent le même d'un jet à l'autre, et si je prenais le premier chiffre, alors je n'aurais pas de valeur inférieure à 0.1...

    
    'alea2
    alea2 = b ^ a * Sqr(a / b + 2) ^ 3
    While alea2 > 100
        alea2 = alea2 / 10
    Wend
    alea2 = alea2 - Int(alea2)
    
    alea = (alea1 + alea2) / 2
    
    getRnd = alea
    
End Function

Conclusion :


évidemment c'est toujours pas le meilleur générateur qui existe, mais celui-ci tient la route...

allez bonne prog !

Helkanen

A voir également

Ajouter un commentaire

Commentaires

Messages postés
5
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
6 décembre 2003

en vb ta huste a utiliser randomize timer c ben plus simple meme si tu utilise rnd au moin sa marche bien
Messages postés
54
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
9 juin 2004

merci sibi12, c bien ce que je pensais...
Messages postés
337
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
15 avril 2006

Bonjour à tous,

Pour helkanen les opérateur And Or et Not sont des opérateurs logique.Si tu veux juste avoir l'explication booléenne fait F1 en le selectionnant c'est très bien expliquer ds l'aide. Sinon ca s'applique aussi a des entiers il suffit d'appliquer bit à bit l'operateur sur chacun des 2 operandes:

par exemple :
10010011
OR 01010010
-------------
11010011

Il y a aussi sous VB les opérateurs Imp Xor et Not(un seul opérande) je crois que c tout
Messages postés
559
Date d'inscription
jeudi 25 juillet 2002
Statut
Membre
Dernière intervention
5 septembre 2007
1
Bon, c'est pas mal tout ca, je vous conseille comme l'ai dit CyberDevil de regarder des generateurs de nombre aleatoires beaucoup plus simples !!!

Genre : c1 = a*c0 + b
c0 est le premier nombre, il permet de creer c1, puis on reinjecte c1 dans la formule : c2 = a*c1 + b
Ainsi, seul le premier nombre a besoin de tickCount (ce qui est une bonne graine de départ).

!!! Attention !!!
a et b ne peuvent etre choisis n'importe comment, faites des essais, vous verrez bien :o). Le mieux serait de prendre des nombres premiers.

De plus, un bon truc tout simple pour eliminer les repetitions est de calculer un resultat beaucoup plus grand que l'ecart voulu, et de le ramener a l'ecart par un modulo :

ecart (0-10)
resultat (0-16000)
ainsi, meme si on a que des chiffres proches les uns des autres, on obtiendra un nombre aleatoire different :o)

Je vais tacher de retrouver le site qui expliquait tout ca :o)
Messages postés
54
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
9 juin 2004

merci Geff
c'est pas mal ce truc...
et si j'ai bien compris, X c'est par exemple gettickcount ?

parce que si c'est ça, il reste juste un problème (qui ne se posait peut etre pas à toi), c'est qu'en faisant 2 nombres aléatoires en moins d'une ms (très probable), et ben... on a pas deux nombres aléatoires, mais égaux...

par contre (eh oui, je suis encore presque un newbie...), euh j'aimerais bien savoir comment fonctionnent les opérateurs booléens (And, Or, Not..) avec des nombres... comme dans l'exelmple ci-dessus... et à quoi ils servent.

bon ben sur ce...
bonne prog à vous

Helkanen
Afficher les 8 commentaires

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.