考虑下面的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上,更改种子后的第一个随机数总是相同的!
我猜这与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岁。
发布于 2009-01-20 17:54:38
Lua的随机数用来使用C的rand(3)和srand(3)函数(see here)。更新:较新的Lua版本use random(3) where available。
C90标准和POSIX都建议使用rand和srand的跨平台实现,但这并不是最好的。它在低位特别缺乏随机性。
一些平台,如Linux,脱离了标准建议,转向了更好的实现(例如random(3))。
OS/X仍然是经典的rand实现,Lua继承了它。
发布于 2009-01-20 17:51:13
通常情况下,使用数值接近的种子多次调用srand不是一个好主意(特别是使用时间值)。在许多情况下,第一个随机数的方差与种子的方差相似。在处理必须转换数字表示形式的脚本语言时,情况可能会更糟。
如果您将种子值更改更多,是否也会发生同样的情况?
发布于 2009-01-21 07:21:46
正如其他人所指出的,出于可移植性的考虑,Lua有意使用C90随机生成器--而C90 RNG并不是很好。
如果你需要好的随机数,使用一些Lua模块来获得它。例如,here是Lua作者之一的Mersenne Twister RNG绑定。
https://stackoverflow.com/questions/461978
复制相似问题