GÉNÉRATEUR DE NOMBRES ALÉATOIRES

Messages postés
262
Date d'inscription
dimanche 1 septembre 2002
Statut
Membre
Dernière intervention
1 février 2019
- - Dernière réponse : yannd0307
Messages postés
22
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
7 novembre 2007
- 16 oct. 2006 à 22:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/7622-generateur-de-nombres-aleatoires

KaViDee
Messages postés
262
Date d'inscription
dimanche 1 septembre 2002
Statut
Membre
Dernière intervention
1 février 2019
-
si tu veux des remarques constructives:
ça peut pas marcher ton générateur vu que tu ne mets pas les arguments nécéssaires lors dans la déclaration de la fonction, en + t'as marqué "functon".
faut mettre ça et ça devrait marcher:

Public Function AleatoirNumber(ByVal x As Double, ByVal y As Double, ByVal x As Double) As Double
AleatoirNumber = ((((x/13)+y)/13)+z)/13
End Function

@+
KaViDee
PS: ça risque de renvoyer des nombres a virgules
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
autre sugestion :

Public Function AleatoirNumber(Min as double , Max as Double) As Double
Randomize Timer
AleatoirNumber = (rnd * (Max+1))+ Min
End Function
SatanCorporation
Messages postés
124
Date d'inscription
lundi 20 janvier 2003
Statut
Membre
Dernière intervention
13 septembre 2003
-
dites moi si je dis une connerie mais un rnd c'est pas mieu ou la meme chose ?

MsgBox Int(Rnd * 100) + 1
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
si, c'est bien ce que j'ai dit !!!
SatanCorporation
Messages postés
124
Date d'inscription
lundi 20 janvier 2003
Statut
Membre
Dernière intervention
13 septembre 2003
-
dsl quand jai posté ma source javais pas vu que tu avais posté ton message
dsl
SatanCorporation
Messages postés
124
Date d'inscription
lundi 20 janvier 2003
Statut
Membre
Dernière intervention
13 septembre 2003
-
merde pas ma source mais mon message
KaViDee
Messages postés
262
Date d'inscription
dimanche 1 septembre 2002
Statut
Membre
Dernière intervention
1 février 2019
-
oups j'ai mis 2 fois "x" ! ça donne ça en fait(j'ai rajouté un arrondi ;):

Function AleatoirNumber(ByVal x As Double, ByVal y As Double, ByVal z As Double) As Double
AleatoirNumber = Round(((((x / 13) + y) / 13) + z) / 13, 3)
End Function
Cyberdevil
Messages postés
483
Date d'inscription
mardi 10 juillet 2001
Statut
Membre
Dernière intervention
12 juillet 2006
-
de toute facon un nombre aléatoire créé par une machine ou meme un humain n'est pas possible ! C un nombre pseudo-aléatoire que l'on génère ici avec Randomize etc... mais ta fonction ne fait rien dautre qu'une petite division.. en gros elle sert a rien !
Désolé de la critique mais fo dire la vérité !
A+
Saros
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010
-
C'est vrai que là, ce n'est pas de l'aléatoire... Si on veut faire du hasard sans Rnd, il faut utiliser une seule variable, Seed, qui change au fur et à mesure que l'on tire des nombres :

Dim Seed As Long

Sub RandSeed(NewSeed As Long)
Seed = NewSeed
End Sub

Function Rnd() As Single
Seed = (Seed + Timer) Mod 1000
Rnd = CSng(Seed / 1000)
End Function

Après, on utilise RandSeed Timer (comme Randomize Timer) puis Rnd...
C''est sur un système comme celui-là que repose les générateurs de nombres pseudo-aléatoires actuels.
Mais bon il y a différents moyens. Et le problème du tien est que l'on doit lui passer des nombres, sans utiliser d'autre facteurs... Ce n'est donc pas un générateur de nombres pseudo-aléatoires...
Mais c'est tout de même un essai, et comme l'on commence toujours par le bas de l'échelle...
Tellmarch
Messages postés
53
Date d'inscription
samedi 22 mars 2003
Statut
Membre
Dernière intervention
27 septembre 2005
-
Saros, tu propose Seed = (Seed + Timer) Mod 1000
ça me parait plutot inutile de faire un générateur de nombres pseudo aléatoires si c'est pour utiliser la fonction timer à chaque fois...
Cette fonction ne devrait servir a priori qu'à l'initialisation.
Il faut de plus éviter d'utiliser des algorithmes choisis au hasard
ne vérifiant aucune des propriétés fondementales telles que l'équiréprobabilité, une distribution uniforme dans un hypercube en dimension 3,4 , une période très grande, etc....
Utilisez plutôt le générateur "additive lagged fibonnacci" qui utilise 2 variables , ou la combinaison de 2 MLCG (multiplicative linear congruential generator).
Pour un simple LCG, celui ci doit bien évidement vérifier les hypothèses du théorème de Knuth.
cs_EBArtSoft
Messages postés
4531
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
5 -
Mais bien sur ... lol
comme la si bien dit SatanCorporation,
si je veus un nombre compris entre X et Y je fait :

MonNombre = X + Int(Rnd * (Y - X))

c'est amplement suffisant, j'ai un theoreme qui dit :
mieu vaut bookiner son manuel VB que de balancer des
sources non testé !

B@nne prog ;-D
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
Tellmarch -> Tes explications pourrait-être utiles si tu expliquais les notions que tu utilises.
La théorie est évidente quand on l'explique, mais si tu donne uniquement les noms des théorêmes et des méthodes (hypercube, suite de fibonnacci, théorême de knut), tu ne parles à personne. Si tu ne veux pas prendre le temps d'expliquer les notions qui sont derrière (et je te comprendrai) fait des liens vers des sites qui le font (le net en regorge).
Rappelle toi que ce site est un site de développeurs, pas de mathématiciens.
cs_laestrella
Messages postés
93
Date d'inscription
lundi 16 juin 2003
Statut
Membre
Dernière intervention
27 juin 2003
-
qui connait pas ça lol???
Saros
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010
-
Ouhla ! Je ne suis qu'en seconde, et je n'ai pas encore vu la probabilité (terminale S)...
Je retire ce que j'ai dit sur les systèmes de générateurs de nombres pseudo-aléatoires actuels, apparemment ça n'a pas l'air d'être ça...
Mais j'ai vu que sur les calculatrices TI, c'est ce système qui est utilisé, et les deux fonctions TI (RandSeed() et rand()) m'ont fait penser aux deux fonctions VB (Randomize() et Rnd()). Je me suis dit que les systèmes étaient les mêmes.
Quant à l'instruction 'Seed = (Seed + Timer) Mod 1000', elle peut être remplacée par n'importe qu'elle autre formule qui 'brouille' Seed.
On peut ajouter des facteurs, en enlever, modifier l'ordre, mais tant qu'il y a un Mod 1000 à la fin, cet algorithme fonctionne...
Mais bon des gars de Microsoft se sont pliés en 4 pour faire un générateur aussi parfait que possible, donc bon...
Mais bon le discours de Tellmarch aura eu au moins un avantage, je sais maintenant qu'est-ce que je vais rechercher sur Internet ce soir :)
Tellmarch
Messages postés
53
Date d'inscription
samedi 22 mars 2003
Statut
Membre
Dernière intervention
27 septembre 2005
-
A propos des calculatrices TI, c'est justement la combinaison de deux MLCG qui est utilisée.
Pour ce qui est des liens, je n'en ai as trouvé de simple qui explique tout...
Voici déja quelques liens:
http://rng.free.fr/
http://www.alrj.org/docs/algo/random.php
http://www.iro.umontreal.ca/~lecuyer/papers.html
Saros
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010
-
OK, pour les LCG j'ai compris, mais le truc des hypercubes et tout ça va attendre la rentrée :)
SHOTOKALEX
Messages postés
12
Date d'inscription
vendredi 27 septembre 2002
Statut
Membre
Dernière intervention
31 août 2006
-
De Toute facon , pour véritablement sortir un nombre aléatoire digne de ce nom (pour une clé de cryptage par exemple) HORS facteur humain, c'est d'avoir un module électronique spécialisé (il faut donc pour un PC rajouter une carte ou utilisé des infos qui change en fonction de l'environnement genre T°, nb tour minute du ventilo, tension d'alim (mais les variations ne sont assez importante et tout les PC ne se ressemble pas), bref une information que renvoie le PC mais dont il n'a aucune influence (sinon c'est du PSeudo aléatoire).
yannd0307
Messages postés
22
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
7 novembre 2007
-
Toutes les solutions proposées avec Randomize(Timer) et X + Int(Rnd * (Y - X)) génère des nombres aléatoires mais certains nombres reviennent souvent. Comment faire pour avoir une liste de X nombres tous différents?
Merci pour celui ou ceux qui ont une réponse :)
Saros
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010
-
Tous différents --> comment ça ?
En pratique le tirage est dans une très large mesure équiprobable
yannd0307
Messages postés
22
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
7 novembre 2007
-
Le but c'est, en ayant à l'avance une liste de nombres (de 0 à 15 par exemple),de les tirer àléatoirement (de "mélanger" la liste en quelque sorte). Peut-on m'aider? Merci.
cs_Warny
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015
-
Tu prends une liste triée et tu tires au sort les numéros en les enlevant de la liste.
Poses ta question dans le forum.
yannd0307
Messages postés
22
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
7 novembre 2007
-
Oui c'est la solution que j'ai trouvé après avoir réfléchi un peu plus. La prochaine fois j'irai voir dans le forum.
Merci en tt cas