QuickCocos2d - math.newrandomseed()

由于要支持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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值