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.
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 :)
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).
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 -> 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.
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.
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...
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+
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
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
Merci en tt cas
Poses ta question dans le forum.
En pratique le tirage est dans une très large mesure équiprobable