2011-06-27 60 views
3

我正在將一個算法從C#移植到Ruby。該算法有一種方法返回有時會溢出的int避免在Fix中自動從Fixnum轉換爲Bignum

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

該算法採用溢流的優勢,避免此函數的返回值獲得超出範圍。然而,Ruby的行爲不同,它會自動將值轉換爲Bignum,但似乎沒有限制......我如何在Ruby中實現相同的功能?

+0

+0不包含單詞「overflow」。 ( –

回答

6

如果你想一個數字,在一定的水平包裹,你可能需要手動限制它:

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

你可以選擇任何限制,你想,在這個例子是簽署了32位。

我不認爲你能夠將數值計算鎖定到任意範圍。

+2

)這與溢出不一樣,例如假設MAXINT是13,MININT是-14,我們需要計算2 * 7/2,溢出時這將是2 * 7 = 14 - >溢出-14, 14/2是-7,但在你的例子中,結果將是2 * 7/2 = 14/2 = 7. – ayckoster

+1

根據你所期望的行爲,你可能想要位掩碼('&0x7FFFFFFF')而不是modody。 – Phrogz

+0

如果你想把它換成負數,你也可以做到這一點,但它比0..N範圍有點棘手。 – tadman

0

一個可能的解決方案是編寫一個包裝程序OverflowingInteger並按預期手動溢出。缺點是您需要將所有Integer轉換爲OverflowingInteger,至少在計算過程中。