0

我一直在声明一个带有 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 位中。

4

2 回答 2

4

Random.Next()只产生31真正的随机性:

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

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

可以生成两个ints 并将它们组合起来以获得具有 62 位随机性的数字:

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

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

byte[] buffer = new byte[8];
rnd.NextBytes(buffer);
data = BitConverter.ToUInt64(buffer, 0);
于 2014-05-06T19:57:27.393 回答
0

这里的问题是你得到 along作为你的表达的结果。错误消息应该很清楚:

无法将类型“long”隐式转换为“ulong”。存在显式转换(您是否缺少演员表?)

您必须将结果显式转换为ulong以将其分配给data,使其

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

但是,如果您只是简单地移动位,您的意图会更清楚:

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

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

于 2014-05-06T19:59:10.740 回答