考虑以下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。
答案 0 :(得分:8)
答案 1 :(得分:4)
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继承它。
答案 2 :(得分:2)
使用数值上接近的种子多次调用srand通常是个坏主意(特别是时间值不好)。在许多情况下,第一个随机数的方差类似于种子的方差。在处理必须转换数字表示的脚本语言时,情况更是如此。
如果您将种子值更改更多,是否会出现同样的情况?
答案 3 :(得分:1)
正如其他人所说,Lua故意使用C90随机发生器以实现便携性 - 而C90 RNG并不是很好。
如果您需要好的随机数,请使用一些Lua模块来获取它。例如,here是由Lua作者之一绑定的Mersenne Twister RNG。
答案 4 :(得分:-2)
如果使用相同的种子,您将从C rand()函数获得相同的数字字符串,但每次都应该获得不同的数字字符串,因为您似乎使用当前时间作为种子。
编辑:我想我应该详细说明我的答案。如果在使用os.time()播种时没有获得随机数字串,则可能无法获得对该函数调用的期望。你从os.time()得到什么值?
编辑#2:此外,该代码块的输出是什么?