为什么Lua中的math.random(999999999999)返回1?

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

同样,在包含 999999999999 的任何 math.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。看起来它像一个正数一样工作。

点赞
用户88888888
用户88888888

这个问题肯定是因为 math.random 对在Lua 5.1和/或5.2中传输的输入参数有着不同的处理方式。从 [mathlib.c] 1 可以看到:

正如你所知,在 C 中,一个标准的 int 可以表示值 -2,147,483,6482,147,483,647 的范围。在你的情况中,如果加上 +1,将会溢出并绕回值,得到 -2,147,483,648。最终的结果是负的,因为你正在将正数乘以一个负数。

有几种方法可以解决和处理这个问题:

  1. 升级到最新的 Lua 5.3 版本。那个版本已经通过将输入参数视为lua_Number来修复了这个问题。
  2. 切换到没有这个整数溢出问题的 LuaJIT。
  3. 使用修补程序修补Lua 5.1 和/或5.2 源,并重新编译。
  4. 修改你的随机范围,使其不会溢出。

至于你最后的查询,请阅读 文档

注意最后一行引用:

math.random(upper) 生成介于 1 和 upper 之间的整数。upper 和 lower 必须是整数。在其他情况下,Lua 将上限转换为整数,有时给出 math.floor(upper) 和其他人给出 math.ceil(upper),导致 意外结果(与 lower 相同)。

2017-08-14 18:52:33