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

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

  private static int NextRandom(int n) { return 1234567890 * n + 12345; } 

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

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

 def next_random(n) (1234567890 * n + 12345) % 0x7FFFFFFF end 

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

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

一种可能的解决方案是编写一个包装器OverflowingInteger并按预期手动溢出。 缺点是您需要将所有Integer转换为OverflowingInteger,至少在计算期间。