为什么在特定平台上Lua生成的首个随机数普遍一致?
- 内容介绍
- 文章标签
- 相关推荐
本文共计316个文字,预计阅读时间需要2分钟。
lua请考虑以下Lua代码段:lualocal time=os.time()for i=1, 10 do time=time + 1 print('Seeding with '..time) math.randomseed(time) for j=1, 5 do print('\t'..math.random(100)) endend在Linux机器上,预期结果是输出如下内容的随机序列:plaintextSeeding with 14589123478Seeding with 25667981054...每轮循环开始时,`time`增加1,并用于设置随机种子,接着输出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.
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继承了它.
本文共计316个文字,预计阅读时间需要2分钟。
lua请考虑以下Lua代码段:lualocal time=os.time()for i=1, 10 do time=time + 1 print('Seeding with '..time) math.randomseed(time) for j=1, 5 do print('\t'..math.random(100)) endend在Linux机器上,预期结果是输出如下内容的随机序列:plaintextSeeding with 14589123478Seeding with 25667981054...每轮循环开始时,`time`增加1,并用于设置随机种子,接着输出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.
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继承了它.

