5

考虑以下 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。

4

3 回答 3

4

Lua 的 random 用于使用 Crand(3)srand(3)函数(参见此处)。更新:较新的 Lua 版本在可用的地方使用 random(3)

C90 标准和 POSIX 都建议跨平台实现,randsrand并不是最好的。它尤其缺乏低位的随机性。

像 Linux 这样的一些平台从标准推荐转向更好的实现(例如random(3))。

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

于 2009-01-20T17:54:37.530 回答
2

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

如果您将种子值更改得更大,是否也会发生同样的事情?

于 2009-01-20T17:51:12.983 回答
1

正如其他人所指出的,Lua 出于可移植性的目的故意使用 C90 随机生成器——而 C90 RNG 并不是很好。

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

于 2009-01-21T07:21:45.513 回答