算法:根据总数随机选择一个数字

本文关键字:数字 一个 选择 随机 算法 | 更新日期: 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;