1

我正在为 iOS 和 OSX 的 Lua 开发一个 roguelike。对 Lua 来说还很陌生,令我沮丧的是,我发现我的平台上的非随机 math.random是如何的。我已经设置了通过函数设置的随机数调用:

function rollD(max)
   return math.random(max)
end

所以我找到了一个很棒的答案来回应这篇文章,结果证明我认为这可以解决我的问题(对于 roguelike 来说,每次游戏都不同是非常关键的)但是为了做出以下调整功能:

function rollD(max)
    return srandom(seedobj,1,max)
end

工作,我必须做:

local seedobj = { seed = -232343 }

来自 Donati 的 Knuth 改编不再是本地的,然后实际修改为使用 (os.time()*-1)。到目前为止,这实际上工作得很好,我的(非常初级的)roguelike 正在像我想要的那样卷起随机的坏人和地牢。但是当事情正常时我担心......

随着对srandom的大量调用(每个级别可能超过一千次调用),我是否会因为将seedobj设置为全局而受到某种性能影响?我想这样想,因为它嵌套在表格中,所以种子是一个参考,我什么都不担心。但除此之外:有没有办法修改这个函数,以便更有效地调用它?

4

1 回答 1

2

在 Lua 中访问一个全局变量就像访问一个表字段。如果seedobj是全局的,则以下代码:

function rollD(max)
    return srandom(seedobj,1,max)
end

在 Lua 5.2 中相当于:

function rollD(max)
    return srandom(_ENV.seedobj,1,max)
end

或在 Lua 5.1 中(大致)相当于

function rollD(max)
    return srandom(_G.seedobj,1,max)
end

where_ENV是保存当前环境表_G的变量,是保存全局表的变量。

因此,与局部变量相比,无论何时调用rollD该间接访问都会导致性能下降。通常,这种惩罚是否显着取决于您调用时执行的其他操作的复杂性rollD

在您的特定情况下,这种惩罚不太可能引起注意,因为srandom实现已经执行了更密集的计算(其中也有一些表访问)。

于 2013-10-19T07:46:24.900 回答