int.MinValue和int.MaxValue之间的随机数(含) [英] Random number between int.MinValue and int.MaxValue, inclusive
问题描述
这有点令人困惑:Random.Next()
具有一个接受最小值和最大值的重载.此重载返回一个大于或等于最小值(包含)且小于最大值(不含)的数字.
Here's a bit of a puzzler: Random.Next()
has an overload that accepts a minimum value and a maximum value. This overload returns a number that is greater than or equal to the minimum value (inclusive) and less than the maximum value (exclusive).
我想包括整个范围,包括最大值.在某些情况下,我可以通过将最大值加一个来完成此操作.但是在这种情况下,最大值可以为int.MaxValue
,并且向其中添加一个值将无法完成我想要的操作.
I would like to include the entire range including the maximum value. In some cases, I could accomplish this by just adding one to the maximum value. But in this case, the maximum value can be int.MaxValue
, and adding one to this would not accomplish what I want.
那么,有人知道从int.MinValue
到int.MaxValue
的随机数吗?
So does anyone know a good trick to get a random number from int.MinValue
to int.MaxValue
, inclusively?
更新:
请注意,下限范围可以是int.MinValue
,但也可以是其他范围.如果我知道它总是int.MinValue
,那么问题会更简单.
Note that the lower range can be int.MinValue
but can also be something else. If I know it would always be int.MinValue
then the problem would be simpler.
推荐答案
Random.Next(int minValue, int maxValue)的>内部实现会生成两个大范围范围内的样本,例如Int32.MinValue
和Int32.MaxValue
之间的范围.对于NextInclusive
方法,我必须使用另一个较大范围的Next
,总共有四个样本.因此,性能应该与填充4个字节(每个字节一个样本)的缓冲区的版本相当.
The internal implementation of Random.Next(int minValue, int maxValue)
generates two samples for large ranges, like the range between Int32.MinValue
and Int32.MaxValue
. For the NextInclusive
method I had to use another large range Next
, totaling four samples. So the performance should be comparable with the version that fills a buffer with 4 bytes (one sample per byte).
public static class RandomExtensions
{
public static int NextInclusive(this Random random, int minValue, int maxValue)
{
if (maxValue == Int32.MaxValue)
{
if (minValue == Int32.MinValue)
{
var value1 = random.Next(Int32.MinValue, Int32.MaxValue);
var value2 = random.Next(Int32.MinValue, Int32.MaxValue);
return value1 < value2 ? value1 : value1 + 1;
}
return random.Next(minValue - 1, Int32.MaxValue) + 1;
}
return random.Next(minValue, maxValue + 1);
}
}
一些结果:
new Random(0).NextInclusive(int.MaxValue - 1, int.MaxValue); // returns int.MaxValue
new Random(1).NextInclusive(int.MaxValue - 1, int.MaxValue); // returns int.MaxValue - 1
new Random(0).NextInclusive(int.MinValue, int.MinValue + 1); // returns int.MinValue + 1
new Random(1).NextInclusive(int.MinValue, int.MinValue + 1); // returns int.MinValue
new Random(24917099).NextInclusive(int.MinValue, int.MaxValue); // returns int.MinValue
var random = new Random(784288084);
random.NextInclusive(int.MinValue, int.MaxValue);
random.NextInclusive(int.MinValue, int.MaxValue); // returns int.MaxValue
更新:我的实现在可能的最大范围(Int32.MinValue
-Int32.MaxValue
)上具有中等的性能,因此我想出了一个新的速度快了4倍.它在我的机器上每秒产生约22,000,000个随机数.我认为它没有比这更快的速度了.
Update: My implementation has mediocre performance for the largest possible range (Int32.MinValue
- Int32.MaxValue
), so I came up with a new one that is 4 times faster. It produces around 22,000,000 random numbers per second in my machine. I don't think that it can get any faster than that.
public static int NextInclusive(this Random random, int minValue, int maxValue)
{
if (maxValue == Int32.MaxValue)
{
if (minValue == Int32.MinValue)
{
var value1 = random.Next() % 0x10000;
var value2 = random.Next() % 0x10000;
return (value1 << 16) | value2;
}
return random.Next(minValue - 1, Int32.MaxValue) + 1;
}
return random.Next(minValue, maxValue + 1);
}
一些结果:
new Random(0).NextInclusive(int.MaxValue - 1, int.MaxValue); // = int.MaxValue
new Random(1).NextInclusive(int.MaxValue - 1, int.MaxValue); // = int.MaxValue - 1
new Random(0).NextInclusive(int.MinValue, int.MinValue + 1); // = int.MinValue + 1
new Random(1).NextInclusive(int.MinValue, int.MinValue + 1); // = int.MinValue
new Random(1655705829).NextInclusive(int.MinValue, int.MaxValue); // = int.MaxValue
var random = new Random(1704364573);
random.NextInclusive(int.MinValue, int.MaxValue);
random.NextInclusive(int.MinValue, int.MaxValue);
random.NextInclusive(int.MinValue, int.MaxValue); // = int.MinValue
这篇关于int.MinValue和int.MaxValue之间的随机数(含)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!