2014-05-06 112 views
0

我一直在聲明一個具有ulong參數的類,但是當我想要在構造函數中分配它時,程序告訴我,有些東西是錯的,但我不明白是什麼。這是一種超長類型,我不想讓他轉換任何東西。如果不能將類型'long'隱式轉換爲'ulong'。 (+ random ulong)

public class new_class 
{ 
    ulong data; 
    new_class() 
    { 
     Random rnd = new Random(); 
     data = rnd.Next() * 4294967296 + rnd.Next(); //4294967296 = 2^32 
    } 
} 

獎勵積分,你可以告訴我,如果這個聲明隨機ULONG是正確的,它應該首先隨機INT(32位),並將它們存儲在ULONG的前32位,然後再做新的隨機數,並將其儲存在第二個32位。

+0

Random.Next'返回一個肯定的(但是有符號的)'int'。你必須把它扔到'ulong'。 – Blorgbeard

回答

3

Random.Next()只生成隨機性位:

一個32位有符號比大於MaxValue的整數大於或等於零且小於。

因爲結果總是正的,最顯著位始終爲0。

可以產生兩個int S和將它們結合起來,以獲得與隨機性的62位號碼:

data = ((ulong)rnd.Next() << 32) + rnd.Next(); 

如果要64位隨機性,另一種方法是使用GetBytes生成8個隨機字節:

byte[] buffer = new byte[8]; 
rnd.NextBytes(buffer); 
data = BitConverter.ToUInt64(buffer, 0); 
0

這裏的問題在於您得到的long作爲表達式的結果。錯誤消息應該很明確:

不能將類型'long'隱式轉換爲'ulong'。 的顯式轉換存在(是否缺少強制轉換?)

你必須明確地把結果以ulong將其分配給data,使其

data = ((ulong) (rnd.Next() * 4294967296 + rnd.Next()) ; 

然而,你的意圖會不過,如果你只是簡單地移位:

ulong data = (((ulong)rng.Next()) << 32) 
      | (((ulong)rng.Next()) << 0) 
      ; 

它也會更快,因爲位移是一個比乘法更簡單的操作。