代码示例将在Lua中,但问题相当笼统 - 它只是一个例子。
for k=0,100 do
::again::
local X = math.random(100)
if X <= 30
then
-- do something
else
goto again
end
end
此代码在0-30之间生成100个伪随机数。它应该在0-100之间进行,但如果其中任何一个大于30,则不会让循环继续。
我尝试在没有goto语句的情况下完成此任务。
for k=0,100 do
local X = 100 -- may be put behind "for", in some cases, the matter is that we need an 'X' variable
while X >= 30 do --IMPORTANT! it's the opposite operation of the "if" condition above!
X = math.random(100)
end
-- do the same "something" as in the condition above
end
相反,该程序运行随机数生成,直到我得到所需的值。一般来说,我把所有代码放在主循环和第一个例子中的条件之间。
理论上,它与第一个示例相同,只是没有goto
s。但是,我不确定。
主要问题:这些程序代码是否相同?他们做同样的事情?如果是,哪个更快(=更优化)?如果不是,有什么区别?
答案 0 :(得分:1)
使用Goto是不好的做法。请参阅http://xkcd.com/292/
无论如何,我对Lua并不多,但这看起来很简单;
对于你的第一个代码:你正在做的是开始循环重复100次。在循环中,您可以在0到100之间创建一个随机数。如果此数字小于或等于30,则使用它执行某些操作。如果此数字大于30,则实际将其丢弃并获得另一个随机数。这种情况一直持续到你有100个随机数,其中ALL将小于或等于30。
第二个代码说:从0到100开始一个循环。然后你将X设置为100.然后你用这个条件开始另一个循环:只要X大于30,就保持随机化X.只有当X是您的代码将退出并执行某些操作。当它执行了100次该动作时,程序结束。
当然,两个代码都做同样的事情,但第一个使用goto - 这无论效率如何都是不好的做法。
第二个代码使用循环,但仍然没有效率 - 有两个级别的循环 - 一个基于伪随机生成,这可能是非常低效的(可能CPU只产生30-100之间的数字万亿迭代?)然后事情变得非常缓慢。但是对于你来说,第一段代码也是如此 - 它有一个基于伪随机数生成的'循环'。
TLDR;严格来说,效率,我没有看到其中一个效率高于另一个。我可能错了,但似乎情况正在发生。
答案 1 :(得分:0)
你可以直接使用math.random(lower,upper)
for k=0,100 do
local X = math.random(0, 30)
end
更快。
答案 2 :(得分:0)
正如我所看到的,这些代码片段也是如此,但使用goto
始终不是最佳选择(在任何编程语言中)。对于lua,请参阅详细信息here