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

4
我刚刚尝试了: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。看起来它作为正数工作。


1
print(math.random(999999999999))Lua在线演示中可以正常工作。您使用的是哪个版本的Lua? - lhf
版本号是5.2。 - Flyingwr
1
在Linux和Mac OS X上,我使用Lua 5.2也很好用。 - lhf
@Mandy8055 使用的是Windows 8.1操作系统。我已经在使用Lua 5.2的Transformice游戏上尝试了该脚本。那么问题可能出现在游戏API和/或Lua版本上,正如你在回答中提到的那样? - Flyingwr
1
也许吧!我在Windows 10上使用Lua时遇到了同样的问题,但最终我解决了它。但问题的解释与我提到的一样,即它将溢出的值包装起来。 - user7571182
1个回答

3
这个问题显然是由于在Lua 5.1和/或5.2中传递的输入参数被math.random处理。来自[mathlib.c] 1
正如你所知,在C中,标准的int类型可以表示值从-2,147,483,6482,147,483,647。在你的用例中将2,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之间的整数。上限和下限必须为整数。否则,Lua会将上限强制转换为整数,有时会给出math.floor(upper),而其他情况则会给出math.ceil(upper),产生意外结果(下限同理)。


在我的Linux和Mac OS X系统中,使用Lua 5.2,它可以正常工作。 - lhf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接