GÉNÉRATEUR DE NOMBRES ALÉATOIRES

KaViDee Messages postés 262 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 18 juin 2008 - 25 juin 2003 à 19:33
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

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
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
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
16 oct. 2006 à 18:49
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
16 oct. 2006 à 18:46
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.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
16 oct. 2006 à 17:10
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
16 oct. 2006 à 12:44
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 :)
SHOTOKALEX Messages postés 12 Date d'inscription vendredi 27 septembre 2002 Statut Membre Dernière intervention 31 août 2006
27 juin 2003 à 06:04
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).
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
26 juin 2003 à 13:17
OK, pour les LCG j'ai compris, mais le truc des hypercubes et tout ça va attendre la rentrée :)
Tellmarch Messages postés 53 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 27 septembre 2005
26 juin 2003 à 12:31
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
26 juin 2003 à 12:07
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 :)
cs_laestrella Messages postés 93 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 27 juin 2003
26 juin 2003 à 09:39
qui connait pas ça lol???
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
26 juin 2003 à 09:17
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_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
26 juin 2003 à 09:04
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
Tellmarch Messages postés 53 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 27 septembre 2005
26 juin 2003 à 08:26
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.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
25 juin 2003 à 23:43
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...
Cyberdevil Messages postés 483 Date d'inscription mardi 10 juillet 2001 Statut Membre Dernière intervention 12 juillet 2006
25 juin 2003 à 23:23
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+
KaViDee Messages postés 262 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 18 juin 2008
25 juin 2003 à 20:03
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
SatanCorporation Messages postés 123 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 13 septembre 2003
25 juin 2003 à 19:52
merde pas ma source mais mon message
SatanCorporation Messages postés 123 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 13 septembre 2003
25 juin 2003 à 19:52
dsl quand jai posté ma source javais pas vu que tu avais posté ton message
dsl
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 juin 2003 à 19:50
si, c'est bien ce que j'ai dit !!!
SatanCorporation Messages postés 123 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 13 septembre 2003
25 juin 2003 à 19:42
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 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 juin 2003 à 19:36
autre sugestion :

Public Function AleatoirNumber(Min as double , Max as Double) As Double
Randomize Timer
AleatoirNumber = (rnd * (Max+1))+ Min
End Function
KaViDee Messages postés 262 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 18 juin 2008
25 juin 2003 à 19:33
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
Rejoignez-nous