2014-05-06 76 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) 
      ; 

它也会更快,因为位移是一个比乘法更简单的操作。