【问题标题】:Why does math.random(999999999999) returns 1 in Lua?为什么 math.random(999999999999) 在 Lua 中返回 1?
【发布时间】:2018-01-22 16:01:56
【问题描述】:

我刚试过:print(math.random(999999999999)),它打印了1

还有任何包含999999999999math.random() 都在打印相同的内容。一些例子:

print(math.random(1.999999999999)) » 1

print(math.random(1999999999999)) » 1

for k,v in next,{math.random(999999999999), math.random(1999999999999), math.random(2.999999999999)} do
    print(v)
end

» 1

local n = math.random(999999999999)
print(n==1)

» true

那我想你明白了(如果你当然知道 Lua)。你能解释一下吗?

@编辑:

我使用的 Lua 版本是 5.2。

我也试过print(math.random(-999999999999)),它打印了111711452。看起来它是一个正数。

【问题讨论】:

  • print(math.random(999999999999))Lua online demo 中对我来说很好用。您使用的是哪个版本的 Lua?
  • 版本为5.2
  • 它在 Lua 5.2 以及 Linux 和 Mac OS X 中对我来说都很好。
  • @Mandy8055 Windows 8.1 操作系统。我已经在使用 Lua 5.2 的 Transformice 游戏上尝试过该脚本。那么问题可能出在您在回答中提到的游戏 API 和/或 Lua 版本上?
  • 也许吧!我在 Windows 10 上使用了 Lua 并遇到了同样的问题然后我终于修复了它。但问题的解释与我提到的相同,因为它正在包装溢出的值

标签: math random lua


【解决方案1】:

这个问题肯定是因为math.random 处理在 Lua 5.1 和/或 5.2 中传递的输入参数。来自[mathlib.c]1

您可能在C 中知道,标准的int 可以表示值-2,147,483,6482,147,483,647。将+1 添加到2,147,483,647,就像在您的用例中一样,将溢出并环绕给出-2,147,483,648 的值。最终结果是负数,因为您将正数与负数相乘。

有几种方法可以纠正和处理这个问题:

  1. 升级到最新的 Lua 版本 5.3 。此后,该解决方案通过将输入参数视为 lua_Number 来解决此问题。
  2. 切换到没有此整数溢出问题的 LuaJIT。
  3. 自行修补 Lua 5.1 和/或 5.2 源代码并重新编译。
  4. 修改随机范围,使其不会溢出

对于您的最后一个查询,请阅读documentation

注意最后一行引号:

math.random(upper) 生成介于 1 和 upper.upper 和 lower 必须是整数。在其他情况下,Lua 强制转换 上转换为整数,有时给出math.floor(upper) 和其他 math.ceil(upper)意外结果(下同)。

【讨论】:

  • 它适用于我在 Linux 和 Mac OS X 中的 Lua 5.2。
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多