Performance Lua新手:交替(Knuth)伪随机函数性能?

Performance Lua新手:交替(Knuth)伪随机函数性能?,performance,random,lua,Performance,Random,Lua,我正在为iOS和OSX开发Lua中的roguelike。Lua是个新手,我很沮丧地发现math.random在我的平台上是多么的不随机。我已经通过函数设置了随机数的调用: function rollD(max) return math.random(max) end function rollD(max) return srandom(seedobj,1,max) end 因此,我找到了一个非常好的答案,我认为这将解决我的问题(对于一个流氓来说,游戏每次都不同是非常关键的),但

我正在为iOS和OSX开发Lua中的roguelike。Lua是个新手,我很沮丧地发现math.random在我的平台上是多么的不随机。我已经通过函数设置了随机数的调用:

function rollD(max)
   return math.random(max)
end
function rollD(max)
    return srandom(seedobj,1,max)
end
因此,我找到了一个非常好的答案,我认为这将解决我的问题(对于一个流氓来说,游戏每次都不同是非常关键的),但为了实现以下调整功能:

function rollD(max)
   return math.random(max)
end
function rollD(max)
    return srandom(seedobj,1,max)
end
在工作中,我必须:

local seedobj = { seed = -232343 }
从Donati的Knuth改编不再是本地的,然后实际修改为使用(os.time()*-1)。到目前为止,这一切都很完美,我的(非常初级的)流氓般的机器人正在像我希望的那样随机卷起坏人和地牢。但我担心当一切正常时


由于对srandom的呼叫数量很大(每个级别可能有上千个呼叫),我是否会因为seedobj的全球化而受到某种性能的影响?我想,因为它嵌套在表中,所以seed是一个引用,我什么都不用担心。但除此之外:是否有办法修改此函数,以便更有效地调用它?

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

function rollD(max)
    return srandom(seedobj,1,max)
end
在Lua 5.2中,等效于:

function rollD(max)
    return srandom(_ENV.seedobj,1,max)
end
或者在Lua5.1中(大致)相当于

function rollD(max)
    return srandom(_G.seedobj,1,max)
end
其中是保存当前环境表的变量,也是保存全局表的变量

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


在您的特定情况下,这种惩罚不太可能是明显的,因为
srandom
实现已经执行了更密集的计算(其中一些表访问也是如此)

评价一个人的正确方法是接受他们的答案和/或投票支持他们的问题/答案(后者可以在你达到至少15个代表点时完成)。在问题/答案的文本中感谢某人是不可接受的(这会在问答中增加无用的混乱)。有时可以使用评论(特别是如果你想强调为什么答案是有用的),但不要滥用它们来表示简单的“谢谢”(或者说“谢谢”,几天后删除评论)。因此,请编辑您的问题,删除表扬(我很感激他们,但他们不属于那里)。