为什么lua中某些平台上的第一个随机数始终相同?

时间:2009-01-20 16:14:24

标签: random 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 rand()函数生成随机数这一事实有关,但有人有解释吗?

编辑:这是linux机器上面代码输出的摘录(即输出是预期的):

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

在OS X机器上,“Seeding with ...”之后的第一个数字始终为66。

5 个答案:

答案 0 :(得分:8)

答案 1 :(得分: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 :(得分:2)

使用数值上接近的种子多次调用srand通常是个坏主意(特别是时间值不好)。在许多情况下,第一个随机数的方差类似于种子的方差。在处理必须转换数字表示的脚本语言时,情况更是如此。

如果您将种子值更改更多,是否会出现同样的情况?

答案 3 :(得分:1)

正如其他人所说,Lua故意使用C90随机发生器以实现便携性 - 而C90 RNG并不是很好。

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

答案 4 :(得分:-2)

如果使用相同的种子,您将从C rand()函数获得相同的数字字符串,但每次都应该获得不同的数字字符串,因为您似乎使用当前时间作为种子。

编辑:我想我应该详细说明我的答案。如果在使用os.time()播种时没有获得随机数字串,则可能无法获得对该函数调用的期望。你从os.time()得到什么值?

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