算法:根据总数随机选择一个数字
本文关键字:数字 一个 选择 随机 算法 | 更新日期: 2023-09-27 18:24:25
我所做的是从列表中随机选择一个项目。然后,我需要根据列表中的总项目等待一个随机间隔。
例如;如果列表中有20个项目,请等待1秒到2秒。如果列表中有10个项目,请等待1到3秒,选择较高的项目。如果列表中有1或2个项目,请等待5到10秒。这些数字是我刚编的,但你明白要点了。更多项目=选择更快的等待时间;项目较少,选择较长的等待时间。
我想知道在.NET中是否有一种更优雅的方法可以做到这一点,而不必使用800if块来实现这一点。
看起来您需要将一个值(可能来自值的范围)映射为结果(对上限/下限)。如果您有少量可能的值,可以使用直接查找表或在范围列表中进行二进制搜索:
具有直接查找功能的完整范围列表:
int itemCount = 2; // make sure it less than number of elements in ranges.
var random = new Random();
var ranges = new Tuple<int, int>[] {
Tuple.Create(0, 1), // value for 0
Tuple.Create(5, 10), // value for 1 item
Tuple.Create(5, 10), // value for 2 items
Tuple.Create(1, 2), // value for 3 items
};
var value = random.NextDouble() * ranges[itemCount].Item1 +
ranges[itemCount].Item2 - ranges[itemCount].Item1;
"功能"值发生变化的点列表:
int itemCount = 5;
var random = new Random();
var ranges = new Tuple<int, double, double>[] {
Tuple.Create(2, 5.0, 10.0), // value for 0-2 items
Tuple.Create(2, 5.0, 10.0), // value for 2-10 items
Tuple.Create(10, 1.0, 3.0), // value for 10-20 items
Tuple.Create(20, 1.0, 2.0), // value for 20+ items
};
// linear search through table, replace with binary search for 10+ items
var range = ranges[0];
for (var i = 0; i < ranges.Length;i++)
{
if (ranges[i].Item1 >= itemCount)
break;
range = ranges[i];
}
var value = random.NextDouble() * range.Item2 + range.Item3 - range.Item2;