当我想在C#中得到一个随机单元时,我做得对吗?

当我想在C#中得到一个随机单元时,我做得对吗?,c#,C#,我想在C#中得到一个随机单元,我做得对吗 Random ran; a[i] = (uint)ran.Next(int.MaxValue); //random only gets to maxInt if (ran.Next(2) == 1) a[i] = (uint)(a[i] | (1 << 31)); Random; a[i]=(uint)run.Next(int.MaxValue)//random只能访问maxInt if(run.Next(2)==1) a[i]=(

我想在C#中得到一个随机单元,我做得对吗

Random ran;
a[i] = (uint)ran.Next(int.MaxValue); //random only gets to maxInt
if (ran.Next(2) == 1)
    a[i] = (uint)(a[i] | (1 << 31));
Random;
a[i]=(uint)run.Next(int.MaxValue)//random只能访问maxInt
if(run.Next(2)==1)

a[i]=(uint)(a[i]|(1你试过运行你的代码吗?它应该立即抛出
NullReferenceException
,因为你没有初始化你的
随机生成器

您只需从
int.MinValue
int.MaxValue
中获取随机int,然后在
未选中的
上下文中将其强制转换为
uint


您甚至试过运行代码吗?它应该立即抛出
NullReferenceException
,因为您没有初始化
ran
随机生成器

您只需从
int.MinValue
int.MaxValue
中获取随机int,然后在
未选中的
上下文中将其强制转换为
uint


为了获得整个可能范围内的随机
uint
,我们不应该使用,因为第二个参数是一个排他上界

(即,它永远不会生成二进制值011111111111111111)

我认为这是合适的,但正如马尔金库拉塞克指出的那样,这并不能产生所需范围的一半

因此,如果你真的想得到所有可能的结果,我想是时候:

var ran = new Random();
var buffer = new byte[4];
ran.GetBytes(buffer);
a[i] = BitConverter.ToUint32(buffer,0);

为了获得整个可能范围内的随机
uint
,我们不应该使用,因为第二个参数是一个排他上界

(即,它永远不会生成二进制值011111111111111111)

我认为这是合适的,但正如马尔金库拉塞克指出的那样,这并不能产生所需范围的一半

因此,如果你真的想得到所有可能的结果,我想是时候:

var ran = new Random();
var buffer = new byte[4];
ran.GetBytes(buffer);
a[i] = BitConverter.ToUint32(buffer,0);

您应该使用无参数的
Random.Next
重载,除非您在此处明确尝试排除
int.MaxValue
作为可能的结果。当使用带参数的重载时,这是一个排他的上限。@Damien\u不信者没有参数的重载只返回正数,因此ld不足以填充
uint
。我现在发布了一个替代方法,可以返回所有可能的
uint
值。您应该使用
Random的重载。下一步
不带参数,除非您在这里明确尝试排除
int.MaxValue
作为可能的结果。当using带参数的重载。@Damien_不信者没有参数的重载只返回正数,因此它不足以填充
uint
。我现在发布了一个替代方法,可以返回所有可能的
uint
值。