c# - int.MinValue 和 int.MaxValue 之间的随机数,包括
问题描述
这有点令人困惑:Random.Next()
有一个接受最小值和最大值的重载。此重载返回一个大于或等于最小值(含)且小于最大值(不含)的数字。
我想包括整个范围,包括最大值。在某些情况下,我只需将最大值加一即可完成此操作。但在这种情况下,最大值可以是int.MaxValue
,并且在此基础上加一并不能达到我想要的效果。
int.MinValue
那么有没有人知道从to获取随机数的好技巧int.MaxValue
?
更新:
请注意,较低的范围可以是int.MinValue
但也可以是其他东西。如果我知道它总是这样int.MinValue
,那么问题会更简单。
解决方案
的内部实现为Random.Next(int minValue, int maxValue)
大范围生成两个样本,例如 和 之间的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
推荐阅读
- python - 我使用 python 子进程在 Ubuntu 18 中输入密码,但在终端中它打开了输入
- istio - Istio ServiceEntry 作为虚拟主机和 VirtualService 可能吗?
- c# - 如何将我的整体查询分解为更模块化和更易于管理的组件?
- bash - Talend Sqoop 将我的自由形式查询拆分为不同的变量
- docker - docker 备份是否包含来自 .env 文件的环境变量?
- flutter - 参数类型'Map
' 不能分配给参数类型 'Map ' 更新 SDK 版本后 - php - 如何在php中使用来自foreach循环的数据创建一个json数组
- html - 如何在 express.js 应用程序中实现 X-Content-Type-Options 标头
- java - AWS Cognito:连接池关闭@Bean
- sql - 如何在选择查询中使用 iff 将来自数据源的 N/A 值替换为雪花上的时间戳字段