-1

代码示例将在 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

相反,该程序运行随机数生成,直到我得到所需的值。一般来说,我把所有的代码都放在了主循环和第一个例子中的条件之间。

从理论上讲,它与第一个示例相同,只是没有gotos。但是,我不确定。

主要问题:这些程序代码是否相等?他们做同样的事情吗?如果是,哪个更快(=更优化)?如果不是,有什么区别?

4

3 回答 3

1

使用 Goto 是不好的做法。请参阅http://xkcd.com/292/

无论如何,我不太喜欢 Lua,但这看起来很简单;

对于您的第一个代码:您正在做的是开始一个循环重复 100 次。在循环中,您创建一个介于 0 和 100 之间的随机数。如果该数字小于或等于 30,则对它进行处理。如果这个数字大于 30,你实际上把它扔掉,得到另一个随机数。这一直持续到你有 100 个随机数,这些随机数都小于或等于 30。

第二个代码说:从 0 到 100 开始一个循环。然后将 X 设置为 100。然后在此条件下开始另一个循环:只要 X 大于 30,就继续随机化 X。仅当 X 小于 30您的代码会退出并执行一些操作。当它执行该动作 100 次时,程序结束。

当然,两个代码都做同样的事情,但第一个代码使用 goto - 无论效率如何,这都是不好的做法。

第二个代码使用循环,但仍然效率不高 - 有 2 级循环 - 一个基于伪随机生成,效率极低(也许 CPU 只生成 30-100 之间的数以进行一万亿次迭代?)然后事情变得非常缓慢。但这对于您是第一段代码也是如此——它有一个基于伪随机数生成的“循环”。

TLDR;严格来说效率,我不认为其中一个比另一个更有效。我可能是错的,但似乎同样的事情正在发生。

于 2013-08-16T13:24:01.340 回答
0

你可以直接使用 math.random(lower, upper)

for k=0,100 do
local X = math.random(0, 30)
end

甚至更快。

于 2013-08-16T13:12:58.430 回答
0

正如我看到的这段代码一样,但使用goto总是不是最好的选择(在任何编程语言中)。对于 lua,请参见此处的详细信息

于 2013-08-16T13:18:40.790 回答