Générer des nombres aléatoires uniformes dans Lua
Je suis en train de travailler sur la programmation d'une chaîne de Markov en Lua, et un élément de ce exige que je me uniformément générer des nombres aléatoires. Voici un exemple simplifié pour illustrer ma question:
example = function(x)
local r = math.random(1,10)
print(r)
return x[r]
end
exampleArray = {"a","b","c","d","e","f","g","h","i","j"}
print(example(exampleArray))
Mon problème est que lorsque je re-exécuter ce programme en plusieurs fois (mash F5) exactement le même nombre aléatoire est généré résultant dans l'exemple de la fonction de sélection de l'exacte même élément de tableau. Cependant, si je comprend de nombreux appels à l'exemple de la fonction au sein du seul programme en répétant la ligne d'impression à la fin de nombreuses fois, j'obtiens adapté des résultats aléatoires.
Ce n'est pas mon intention est d'un bon de Markov pseudo-générateur de texte aléatoire devrait être en mesure d'exécuter le même programme avec les mêmes entrées à de multiples reprises et de sortie différents pseudo-aléatoire de texte à chaque fois. J'ai essayé de réinitialiser les graines à l'aide de math.randomseed(os.time())
et ce qui le rend si le nombre aléatoire de distribution n'est plus uniforme. Mon objectif est d'être en mesure de ré-exécuter le programme ci-dessus et recevez un choisi au hasard le numéro de tous les temps.
source d'informationauteur Starfish_Prime
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour exécuter
math.randomseed()
une fois avant d'utilisermath.random()
comme ceci:De votre commentaire que vous avez vu le premier nombre est toujours le même. Ceci est causé par la mise en œuvre du générateur aléatoire, dans certains plates-formes.
La solution est de la pop un peu de nombres aléatoires avant de l'utiliser pour de vrai:
Noter que la bibliothèque standard C
random()
est généralement pas si uniformément aléatoire, une meilleure solution consiste à utiliser un meilleur générateur de hasard, si votre plate-forme fournit un.Référence: Lua Bibliothèque De Mathématiques
Standard C générateur de nombres aléatoires utilisé dans Lua n'est pas guananteed d'être bon pour la simulation. Les mots "chaîne de Markov" suggèrent que vous mai besoin d'un meilleur. Voici un générateur largement utilisé pour les calculs de Monte Carlo:
Il génère un nombre entre 0 et 1, donc
r = math.floor(rand()*10) + 1
irait dans votre exemple.(C'est multiplicative générateur de nombre aléatoire avec une période de 2^38, multiplicateur de 5^17 et modulo 2^40, original Pascal code par http://osmf.sscc.ru/~smp/)
Toujours se traduit par un nouveau nombre aléatoire. Changement de semences de la valeur de garantir le caractère aléatoire, Ne pas suivre
os.time()
cuz son époque et des changements après une seconde, maisos.clock()
n'avez pas la même valeur en tout près de l'instance. Cheers!