这有点令人困惑:Random.Next()
具有一个接受最小值和最大值的重载。此重载返回一个大于或等于最小值(包含)且小于最大值(不含)的数字。
我想包括整个范围,包括最大值。在某些情况下,我可以通过将最大值加一个来完成此操作。但是在这种情况下,最大值可以是int.MaxValue
,对此添加一个值将无法完成我想要的操作。
那么,有没有人知道从int.MinValue
到int.MaxValue
(包括整个范围)获得随机数的好技巧?
更新:
请注意,下限范围可以是int.MinValue
,也可以是其他内容。如果我知道它始终是int.MinValue
,那么问题会更简单。
最佳答案
Random.Next(int minValue, int maxValue)
的internal implementation会为大范围(例如Int32.MinValue
和Int32.MaxValue
之间的范围)生成两个样本。对于NextInclusive
方法,我不得不使用另一个大范围的Next
,总共有四个样本。因此,性能应与填充4个字节(每个字节一个样本)的缓冲区的版本相当。
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个随机数。我认为它不会比这更快。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
关于c# - int.MinValue和int.MaxValue之间的随机数(含),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57118385/