避免在Ruby中从Fixnum自动转换为Bignum

mig*_*rso 3 ruby type-conversion

我正在将一个算法从C#移植到Ruby.该算法有一种方法可以返回int有时溢出的方法.

    private static int NextRandom(int n)
    {
        return 1234567890 * n + 12345;
    }
Run Code Online (Sandbox Code Playgroud)

该算法利用溢出来避免此函数返回的值超出范围.但是,Ruby的行为不同,它会自动将值转换为Bignum,这似乎没有限制......我如何在Ruby中实现相同的目标?

tad*_*man 6

如果您想要一个数字包裹在某个级别,您可能需要手动限制它:

def next_random(n)
  (1234567890 * n + 12345) % 0x7FFFFFFF
end
Run Code Online (Sandbox Code Playgroud)

您可以选择所需的任何限制,该示例是32位签名.

我认为你无法将数值计算锁定到任意范围.

  • 这与溢出不同.例如,假设MAXINT为13且MININT为-14,我们需要计算2*7/2.溢出时,这将是2*7 = 14 - >溢出-14和-14/2是-7.但在您的示例中,结果将是2*7/2 = 14/2 = 7. (2认同)