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

Woo*_*kai 5 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
Run Code Online (Sandbox Code Playgroud)

在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
[...]
Run Code Online (Sandbox Code Playgroud)

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

ori*_*rip 4

Lua 随机使用 C 语言rand(3)srand(3)函数(参见此处)。更新:较新的 Lua 版本在可用的情况下使用 random(3)

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

一些平台(例如 Linux)放弃了标准建议,转而采用更好的实现(例如random(3))。

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

  • 包括 C90 在内的所有 C 标准都没有定义“rand”或“srand”的任何类型的实现。它们只是指定函数应该做什么(返回伪随机数)。标准确实包含示例实现,但示例在 ISO 标准中并不规范——它们不施加任何限制。C 的实现可以使用它们想要的任何版本的 `rand` 和 `srand`,并且使用示例之外的定义绝对不是“不合格”。我建议您更改措辞:)(例如,[C89](http://port70.net/~nsz/c/c89/c89-draft.html#4.10.2))。 (2认同)