为什么math.random(99999999999)在Lua中返回1?

为什么math.random(99999999999)在Lua中返回1?,math,random,lua,Math,Random,Lua,我刚刚试过:print(math.random(9999999999999))它已经打印了1 另外,任何包含9999999999的math.random()都在打印相同的内容。一些例子: 打印(数学随机(1.99999999999))>1 for k,v in next,{math.random(999999999999), math.random(1999999999999), math.random(2.999999999999)} do print(v) end local n

我刚刚试过:
print(math.random(9999999999999))
它已经打印了
1

另外,任何包含
9999999999
math.random()
都在打印相同的内容。一些例子:

打印(数学随机(1.99999999999))
>
1

for k,v in next,{math.random(999999999999), math.random(1999999999999), math.random(2.999999999999)} do
    print(v)
end
local n = math.random(999999999999)
print(n==1)
print(math.random(199999999999))
»
1

for k,v in next,{math.random(999999999999), math.random(1999999999999), math.random(2.999999999999)} do
    print(v)
end
local n = math.random(999999999999)
print(n==1)
»
1

for k,v in next,{math.random(999999999999), math.random(1999999999999), math.random(2.999999999999)} do
    print(v)
end
local n = math.random(999999999999)
print(n==1)
»
true

那我想你明白了(当然,如果你认识卢阿的话)。你能给我解释一下吗

@编辑:

我使用的Lua版本是5.2


我还尝试了
打印(math.random(-9999999999999))
,它打印了
111711452
。它看起来像一个正数。

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

正如您在
C
中所知,标准int可以表示值
-2147483648
2147483647
。将
+1
添加到
2147483647
,就像在您的用例中一样,将溢出并环绕给出的值
-2147483648
。最终结果是负数,因为您将正数乘以负数

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

  • 升级至最新的Lua版本5.3。此后,该方法将输入参数处理为lua_u号来解决这个问题
  • 切换到没有此整数溢出问题的LuaJIT
  • 使用修复程序修补Lua5.1和/或5.2源代码,然后重新编译
  • 修改随机范围,使其不会溢出
  • 对于最后一个查询,请阅读

    请注意最后一行引号:

    math.random(上)
    生成介于1和之间的整数 上限。上限和下限必须为整数。在另一种情况下,Lua将强制转换 上限转换为整数,有时给出
    math.floor(上限)
    和其他
    math.ceil(上部)
    ,具有意外结果(下部相同)


    print(math.random(9999999999))
    对我来说很好用。您使用的是哪一版本的Lua?该版本是5.2。我认为Lua 5.2在Linux和Mac OS X中都可以正常工作。@Mandy8055 Windows 8.1 OS。我在Transformice游戏中尝试过这个脚本,它使用Lua5.2。那么也许问题应该出现在游戏API和/或Lua版本上,就像你在回答中提到的那样?也许!我在windows 10上使用了Lua,遇到了同样的问题,然后我最终修复了它。但问题的解释与我提到的相同,因为它包含了溢出值。在Linux和Mac OS X中,Lua 5.2对我来说都很好。