请考虑以下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.
Lua 随机使用 C 语言rand(3)和srand(3)函数(参见此处)。更新:较新的 Lua 版本在可用的情况下使用 random(3)。
C90 标准和 POSIX 都建议跨平台实现,rand但这srand并不是最好的。它尤其缺乏低位的随机性。
一些平台(例如 Linux)放弃了标准建议,转而采用更好的实现(例如random(3))。
OS/X 仍然忠于经典rand实现,Lua 继承了它。