KaViDee
Messages postés262Date d'inscriptiondimanche 1 septembre 2002StatutMembreDernière intervention18 juin 2008
-
25 juin 2003 à 19:33
yannd0307
Messages postés22Date d'inscriptiondimanche 18 septembre 2005StatutMembreDerniè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.
yannd0307
Messages postés22Date d'inscriptiondimanche 18 septembre 2005StatutMembreDerniè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és473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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és22Date d'inscriptiondimanche 18 septembre 2005StatutMembreDerniè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és921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 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és22Date d'inscriptiondimanche 18 septembre 2005StatutMembreDerniè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és12Date d'inscriptionvendredi 27 septembre 2002StatutMembreDernière intervention31 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és921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 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és53Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention27 septembre 2005 26 juin 2003 à 12:31
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 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és93Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention27 juin 2003 26 juin 2003 à 09:39
qui connait pas ça lol???
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és53Date d'inscriptionsamedi 22 mars 2003StatutMembreDernière intervention27 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és921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 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és483Date d'inscriptionmardi 10 juillet 2001StatutMembreDernière intervention12 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és262Date d'inscriptiondimanche 1 septembre 2002StatutMembreDernière intervention18 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és123Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention13 septembre 2003 25 juin 2003 à 19:52
merde pas ma source mais mon message
SatanCorporation
Messages postés123Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention13 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 25 juin 2003 à 19:50
si, c'est bien ce que j'ai dit !!!
SatanCorporation
Messages postés123Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention13 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és262Date d'inscriptiondimanche 1 septembre 2002StatutMembreDernière intervention18 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
16 oct. 2006 à 22:12
Merci en tt cas
16 oct. 2006 à 18:49
Poses ta question dans le forum.
16 oct. 2006 à 18:46
16 oct. 2006 à 17:10
En pratique le tirage est dans une très large mesure équiprobable
16 oct. 2006 à 12:44
Merci pour celui ou ceux qui ont une réponse :)
27 juin 2003 à 06:04
26 juin 2003 à 13:17
26 juin 2003 à 12:31
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
26 juin 2003 à 12:07
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 :)
26 juin 2003 à 09:39
26 juin 2003 à 09:17
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.
26 juin 2003 à 09:04
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
26 juin 2003 à 08:26
ç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.
25 juin 2003 à 23:43
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...
25 juin 2003 à 23:23
Désolé de la critique mais fo dire la vérité !
A+
25 juin 2003 à 20:03
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
25 juin 2003 à 19:52
25 juin 2003 à 19:52
dsl
25 juin 2003 à 19:50
25 juin 2003 à 19:42
MsgBox Int(Rnd * 100) + 1
25 juin 2003 à 19:36
Public Function AleatoirNumber(Min as double , Max as Double) As Double
Randomize Timer
AleatoirNumber = (rnd * (Max+1))+ Min
End Function
25 juin 2003 à 19:33
ç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