我正在將一個算法從C#移植到Ruby。該算法有一種方法返回有時會溢出的int
。避免在Fix中自動從Fixnum轉換爲Bignum
private static int NextRandom(int n)
{
return 1234567890 * n + 12345;
}
該算法採用溢流的優勢,避免此函數的返回值獲得超出範圍。然而,Ruby的行爲不同,它會自動將值轉換爲Bignum,但似乎沒有限制......我如何在Ruby中實現相同的功能?
我正在將一個算法從C#移植到Ruby。該算法有一種方法返回有時會溢出的int
。避免在Fix中自動從Fixnum轉換爲Bignum
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,至少在計算過程中。
+0不包含單詞「overflow」。 ( –