我已经声明了一个带有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位位。
答案 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 )
;
它也会更快,因为位移是比乘法更简单的操作。