Jon*_*eet 21
最简单的方法可能是使用两个调用:一个用于30位,一个用于最后两个.这个答案的早期版本假设Random.Next()有一个包含上限int.MaxValue,但事实证明它是独占的 - 所以我们只能获得30个统一位.
uint thirtyBits = (uint) random.Next(1 << 30);
uint twoBits = (uint) random.Next(1 << 2);
uint fullRange = (thirtyBits << 2) | twoBits;
Run Code Online (Sandbox Code Playgroud)
(当然,你可以把它当作两个16位值,作为替代......或者介于两者之间的各种选项.)
或者,您可以使用NextBytes填充4字节数组,然后使用BitConverter.ToUInt32.
P_P*_*P_P 16
或者有一种简单的方法来生成一个真正的随机uint?
我承认,这不是OQ.很明显,有更快的方法来生成不是真实的随机uints.尽管如此,我认为没有人对产生这些产品太感兴趣,除非由于某种原因需要非平面分布.让我们从一些研究开始,让它在C#中变得简单快捷.当我编写代码时,简单快速通常表现得像同义词.
请参阅MSDN.
Random 构造函数:
Random():Random使用与时间相关的默认种子值初始化类的新实例.Random(int seed):Random使用指定的种子值初始化类的新实例.要提高性能,请创建一个Random对象以随时间生成许多随机数,而不是重复创建新Random对象以生成一个随机数,因此:
private static Random rand = new Random();
Run Code Online (Sandbox Code Playgroud)
Random 方法:
rand.Next():返回一个正的随机数,大于或等于零,小于int.MaxValue.rand.Next(int max):返回一个正的随机数,大于或等于零,小于max,max必须大于或等于零.rand.Next(int min, int max):返回一个正的随机数,大于或等于min,小于max,max必须大于或等于min.家庭作业显示的rand.Next()速度大约是原来的两倍rand.Next(int max).
假设一个正int只有两位,忘记符号位,它为零,rand.Next()以相同的概率返回三个不同的值:
00
01
10
Run Code Online (Sandbox Code Playgroud)
对于真随机数,最低位经常为零,对于最高位是相同的.
为了使它适用于最低位使用:rand.Next(2)
假设一个int有三位,rand.Next()返回七个不同的值:
000
001
010
011
100
101
110
Run Code Online (Sandbox Code Playgroud)
要使其适用于最低两位,请使用: rand.Next(4)
假设int有n位.
为了使它适用于n位使用:rand.Next(1 << n)
要使其最多使用30位,请使用:rand.Next(1 << 30)
它是最大值,1 << 31大于int.MaxValue.
这导致了一种生成真正的随机uint的方法:
private static uint rnd32()
{
return (uint)(rand.Next(1 << 30)) << 2 | (uint)(rand.Next(1 << 2));
}
Run Code Online (Sandbox Code Playgroud)
快速检查:产生零的几率是多少?
1 << 2 = 4 = 2 2,1 << 30 = 2 30
零的机会是:1/2 2*1/2 30 = 1/2 32
总的数量,包括零:2 32
它像白昼一样清晰,没有烟雾警报,不是吗?
是否可以更快地使用它 rand.Next()
int.Maxvalue is: (2^31)-1
The largest value rand.Next() returns is: (2^31)-2
uint.MaxValue is: (2^32)-1
Run Code Online (Sandbox Code Playgroud)
何时rand.Next()使用两次并添加结果,最大可能值为:
2*((2^31)-2) = (2^32)-4
Run Code Online (Sandbox Code Playgroud)
与uint.MaxValue的区别在于:
(2^32)-1 - ((2^32)-4) = 3
Run Code Online (Sandbox Code Playgroud)
要达到uint.MaxValue,rand.Next(4)必须添加另一个值,因此我们得到:
rand.Next()+ rand.Next()+ rand.Next(4)
产生零的几率是多少?
大概:1/2 31*1/2 31*1/4 = 1/2 64,它应该是1/2 32
等一下,怎么样:
2 * rand.Next() + rand.Next(4)
Run Code Online (Sandbox Code Playgroud)
再次,有什么机会产生零?
大概:1/2 31*1/4 = 1/2 33,太小而不能真正随机.
另一个简单示例:
rand.Next(2) + rand.Next(2),所有可能的结果:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 2
Run Code Online (Sandbox Code Playgroud)
平等概率?想都别想.
结论:添加真随机数给出一个随机数,但不是真正的随机数.扔两个公平的骰子......
小智 9
生成随机数的最简单方法uint:
uint ui = (uint) new Random().Next(-int.MaxValue, int.MaxValue);
Run Code Online (Sandbox Code Playgroud)