由于要支持ios64位,不得不把quickcocos2d 2.2.5 版本升级到2.2.6,而升级把luajit 改成了 lua, luajit 现不支持64位,
但math.random()随机出来的数字没有任何改变。
查看代码后,发现每次随机都调用了math.newrandomseed()方法,于是做个了测试
for i=1,10 do
math.newrandomseed();
print(math.random(1, 100));
end
结果:
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
Cocos2d: [1.6717] 75
math.newrandomseed();
for i=1,10 do
print(math.random(1, 100));
end
结果:
Cocos2d: [1.7193] 54
Cocos2d: [1.7193] 42
Cocos2d: [1.7193] 21
Cocos2d: [1.7193] 17
Cocos2d: [1.7193] 92
Cocos2d: [1.7193] 7
Cocos2d: [1.7193] 71
Cocos2d: [1.7193] 63
Cocos2d: [1.7193] 86
Cocos2d: [1.7194] 26
查看源码发现2.2.6 math.randomseed(socket.gettime()) 少 * 1000, 意思就是没有了毫秒种子,用秒作种子,1秒内new种子都是相同的,这个for循环跑不过一秒吧,所以随机出来的数也是相同的。
cocos2d为什么要删除“* 1000” 答案:
在socket模块存在时,math.newrandomseed()里使用的种子如下:
math.randomseed(socket.gettime() * 1000)
本意是用毫秒数作为种子,原来使用luajit没有问题,但改成lua以后,在32位机器上这个数作为种子会超过最大值,导致设置新种子无效。
现在已经改成 math.randomseed(socket.gettime()),问题已经解决。
2.2.5
function math.newrandomseed()
local ok, socket = pcall(function()
return require("socket")
end)
if ok then
-- 如果集成了 socket 模块,则使用 socket.gettime() 获取随机数种子
math.randomseed(socket.gettime() * 1000)
else
math.randomseed(os.time())
end
math.random()
math.random()
math.random()
math.random()
end
2.2.6
function math.newrandomseed()
local ok, socket = pcall(function()
return require("socket")
end)
if ok then
-- 如果集成了 socket 模块,则使用 socket.gettime() 获取随机数种子
math.randomseed(socket.gettime())
else
math.randomseed(os.time())
end
math.random()
math.random()
math.random()
math.random()
end
结论:没有了毫秒的随机种子,每一次随机出来的数基本相同,所以 math.newrandomseed()用法,不能在循环中用,下面我认为正确的用法。
math.newrandomseed();
for i=1,10 do
print(math.random(1, 100));
end