无法隐式转换类型' long'到了' ulong'。 (+随机ulong)

时间:2014-05-06 19:48:00

标签: c# class random constructor ulong

我已经声明了一个带有ulong参数的类,但是当我想要在构造函数中指定它时,程序告诉我,有些东西是错的,但我不明白它是什么。这是一种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位位。

2 个答案:

答案 0 :(得分:4)

Random.Next()仅生成 31 true 随机性:

  

大于或等于零且小于MaxValue的32位有符号整数。

由于结果始终为正,因此最高有效位始终为0.

可以生成两个int并将它们组合起来得到一个62位随机数的数字:

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

如果你想要64位随机性,另一种方法是使用GetBytes生成8个随机字节:

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

答案 1 :(得分:0)

这里的问题是你的表达结果是long。错误消息应该非常清楚:

  

无法将类型'long'隐式转换为'ulong'。   存在显式转换(您是否错过了演员?)

您必须明确地将结果投射到ulong以将其分配给data,并将其设为

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

然而,如果你只是简单地移位,你的意图会更清楚:

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

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