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

时间:2017-08-14 18:36:20

标签: math random lua

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

包含math.random()的任何999999999999也会打印相同的内容。一些例子:

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的话)。你能解释一下吗?

@Edits:

我使用的Lua版本是5.2。

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

1 个答案:

答案 0 :(得分:5)

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

正如您在C中所知,标准int可以将值-2,147,483,648表示为2,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. 修改您的随机范围,使其不会溢出
  5. 对于您的上一次查询,请阅读文档:http://lua-users.org/wiki/MathLibraryTutorial

    注意最后一行引号:

      

    math.random(upper)生成 1和之间的整数   upper .upper和lower必须是整数。在其他情况下,Lua施放   上限为整数,有时给出math.floor(upper)和其他   math.ceil(upper)意外结果(下限相同)。