GÉNÉRATEUR DE NOMBRES ALÉATOIRES

Signaler
Messages postés
262
Date d'inscription
dimanche 1 septembre 2002
Statut
Membre
Dernière intervention
18 juin 2008
-
Messages postés
22
Date d'inscription
dimanche 18 septembre 2005
Statut
Membre
Dernière intervention
7 novembre 2007
-
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

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
Messages postés
473
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.
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.
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
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 :)
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).
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 :)
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
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 :)
Messages postés
93
Date d'inscription
lundi 16 juin 2003
Statut
Membre
Dernière intervention
27 juin 2003

qui connait pas ça lol???
Messages postés
473
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.
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
8
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
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.
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...
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+
Messages postés
262
Date d'inscription
dimanche 1 septembre 2002
Statut
Membre
Dernière intervention
18 juin 2008

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
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
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
si, c'est bien ce que j'ai dit !!!
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
autre sugestion :

Public Function AleatoirNumber(Min as double , Max as Double) As Double
Randomize Timer
AleatoirNumber = (rnd * (Max+1))+ Min
End Function
Messages postés
262
Date d'inscription
dimanche 1 septembre 2002
Statut
Membre
Dernière intervention
18 juin 2008

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