En Lua, normalmente se generarían valores aleatorios y/o cadenas utilizando math.random
& math.randomseed
, donde os.time
se usa para math.randomseed
.(seguro) Cadena aleatoria?
Sin embargo, este método tiene una gran debilidad; El número devuelto siempre es tan aleatorio como la hora actual, Y el intervalo para cada número aleatorio es un segundo, que es demasiado largo si se necesitan muchos valores aleatorios en muy poco tiempo.
Este problema lo señalan incluso los usuarios de Lua wiki: http://lua-users.org/wiki/MathLibraryTutorial, y la correspondiente receta de RandomStringS: http://lua-users.org/wiki/RandomStrings.
Así que he senté a escribir un algoritmo diferente (si es que se puede llamar así), que genera números aleatorios por el (mal) uso de las direcciones de memoria de tablas:
math.randomseed(os.time())
function realrandom(maxlen)
local tbl = {}
local num = tonumber(string.sub(tostring(tbl), 8))
if maxlen ~= nil then
num = num % maxlen
end
return num
end
function string.random(length,pattern)
local length = length or 11
local pattern = pattern or '%a%d'
local rand = ""
local allchars = ""
for loop=0, 255 do
allchars = allchars .. string.char(loop)
end
local str=string.gsub(allchars, '[^'..pattern..']','')
while string.len(rand) ~= length do
local randidx = realrandom(string.len(str))
local randbyte = string.byte(str, randidx)
rand = rand .. string.char(randbyte)
end
return rand
end
Al principio , todo parece perfectamente aleatorio, y estoy seguro de que son ... al menos para el programa actual.
Así que mi pregunta es, ¿qué tan aleatorios son estos números devueltos por realrandom
realmente?
O hay una mejor manera de generar números aleatorios en un intervalo de menos de un segundo (lo que implica que tipo de os.time
no debe utilizarse, como explaind arriba), sin depender de bibliotecas externas, Y, si es posible, de una manera completamente cruzada?
EDIT:
Parece haber un gran malentendido con respecto a la forma en que se sembró el RNG; En el código de producción, la llamada al math.randomseed()
ocurre una sola vez, este fue solo un ejemplo mal elegido aquí.
Lo que quiero decir con el valor aleatorio es única al azar una vez por segundo, es fácilmente demostrable con esta pasta: http://codepad.org/4cDsTpcD
Como se conseguirá downvoted esta pregunta sin tener en cuenta mis ediciones, también cancelaron mi respuesta previamente aceptada - En la esperanza de una mejor, incluso si solo mejores opiniones. Entiendo que los problemas relacionados con los valores/números aleatorios se han discutido muchas veces antes, pero no he encontrado una pregunta que pueda ser relevante para Lua. ¡Por favor, téngalo en cuenta!
Me viene a la mente una cita de Knuth ... "los números aleatorios no deberían generarse con un método elegido al azar". – Mormegil
Tenga en cuenta que generalmente es un mal estilo para extender o cambiar los espacios de nombres de Lua estándar. No use 'string.random', escriba su propio módulo. –
¿Qué obtienes para 'string.random (20, 'abcd')'? – aaz