首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能隐式地将类型'long‘转换为'ulong’。(+随机ulong)

不能隐式地将类型'long‘转换为'ulong’。(+随机ulong)
EN

Stack Overflow用户
提问于 2014-05-06 19:47:59
回答 2查看 2.1K关注 0票数 0

我一直在声明一个带有ulong参数的类,但是当我想在构造函数中分配它时,程序告诉我,有些事情是错误的,但我不明白是什么。这是乌龙式的,我不想让他改变任何东西。

代码语言:javascript
复制
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位中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-06 19:57:27

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

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

由于结果总是正的,所以最重要的位总是0。

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

代码语言:javascript
复制
data = ((ulong)rnd.Next() << 32) + rnd.Next();

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

代码语言:javascript
复制
byte[] buffer = new byte[8];
rnd.NextBytes(buffer);
data = BitConverter.ToUInt64(buffer, 0);
票数 4
EN

Stack Overflow用户

发布于 2014-05-06 19:59:10

这里的问题是,作为表达式的结果,您将得到一个long。错误信息应该非常清楚地表明:

不能隐式地将类型'long‘转换为'ulong’。存在显式转换(是否缺少强制转换?)

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

代码语言:javascript
复制
data = ((ulong) ( rnd.Next() * 4294967296 + rnd.Next() ) ;

但是,如果您只是简单地改变位元,那么您的意图就会更清楚:

代码语言:javascript
复制
ulong data = ( ((ulong)rng.Next()) << 32 )
           | ( ((ulong)rng.Next()) <<  0 )
           ;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23503638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档