我一直在声明一个带有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位中。
发布于 2014-05-06 19:57:27
Random.Next()只生成31位真正的随机性:
大于或等于零且小于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);发布于 2014-05-06 19:59:10
这里的问题是,作为表达式的结果,您将得到一个long。错误信息应该非常清楚地表明:
不能隐式地将类型'long‘转换为'ulong’。存在显式转换(是否缺少强制转换?)
您必须显式地将结果转换为ulong,以便将其分配给data,使其成为
data = ((ulong) ( rnd.Next() * 4294967296 + rnd.Next() ) ;但是,如果您只是简单地改变位元,那么您的意图就会更清楚:
ulong data = ( ((ulong)rng.Next()) << 32 )
| ( ((ulong)rng.Next()) << 0 )
;它也会更快,因为位移位是一个比乘法更简单的操作。
https://stackoverflow.com/questions/23503638
复制相似问题