2009-01-20 201 views
5

考虑以下LUA代码片段:为什么lua中的某些平台上的第一个随机数总是相同的?

local time = os.time() 
for _= 1, 10 do 
    time = time + 1 
    print('Seeding with ' .. time) 
    math.randomseed(time) 
    for i = 1, 5 do 
     print('\t' .. math.random(100)) 
    end 
end 

在Linux计算机上,其结果是,不出所料,随机数。但似乎至少在Mac OS X上,更改种子后的第一个随机数始终是相同的!

我想这是关系到事实的Lua依赖于C兰特用于生成随机数()函数,但没有任何人有一个解释?

编辑:这里是上述码的Linux机器上的输出的提取物(即,如预期的输出):

$ lua test.lua 
Seeding with 1232472273 
    69 
    30 
    83 
    59 
    84 
Seeding with 1232472274 
    5 
    21 
    63 
    91 
    27 
[...] 

在OS X光机,“播种后的第一个数字与......”一直是66

+0

你是否在两台机器上使用相同的lua版本?也许是Mac OS X中的一个错误。 – 2009-01-20 16:25:23

+0

是的,我使用最新的lua版本。 – Wookai 2009-01-20 17:08:55

回答

4

Lua的随机用于使用C的rand(3)srand(3)函数(see here)。更新:更新的Lua版本use random(3) where available

C90标准和POSIX都建议跨平台实现randsrand这不是最好的。它特别缺少低位的随机性。

如Linux有些平台移出标准建议,以更好地实现(例如random(3))。

OS/X仍然忠实于经典rand实施,和Lua继承它。

-2

如果使用相同的种子,你会得到从C兰特)功能编号(相同字符串,但你应该因为你似乎每次都得到一个不同的一串数字将当前时间用作种子。

编辑:我想我应该阐述我的答案。如果在使用os.time()进行播种时没有获得随机数字串,则可能无法获得您期望从该函数调用获得的结果。你从os.time()返回的值是什么?

编辑#2:此外,该代码块的输出是什么?

+0

我很清楚使用相同的种子给出伪随机数字的相同序列的事实。我的问题是关于使用不同种子的事实,第一个生成的数字在某些平台上似乎是相同的。 – Wookai 2009-01-20 17:09:44

2

它通常是一个坏主意,函数srand多次与在数值上接近(尤其是坏与时间值这样做)种子调用。在许多情况下,第一个随机数的方差类似于种子的方差。在处理必须转换数字表示的脚本语言时,可能更是如此。

如果您将种子值更改一次,会发生同样的情况吗?

1

正如其他人所指出的,Lua中故意使用C90随机数生成器的便携性的缘故 - 和C90 RNG不是很好。

如果你需要很好的随机数,使用一些Lua模块来获取它。例如,here是由Lua作者之一绑定的Mersenne Twister RNG。

相关问题