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

时间:2014-09-25 01:53:55

标签: c# vb.net random

我所做的是从列表中选择一个随机项目。然后我需要根据列表中的总项目等待一个随机间隔。

例如;如果列表中有20个项目,请等待1秒到2秒之间。 如果列表中有10个项目,请在1到3秒之间等待更高的值。 如果列表中有1个或2个项目,请等待5到10秒之间的某个时间。 这些数字我刚刚编写,但你得到了要点。更多项目=选择更快的等待时间;更少的物品,选择更长的等待时间。

我想知道是否有更优雅的方式在.NET中执行此操作,而无需使用800 if块来实现此目的。

1 个答案:

答案 0 :(得分:1)

看起来您需要将值(可能从值范围)映射到结果(对上/下限)。如果您有少量可能的值,或者在范围列表中进行二进制搜索,则可以使用直接lookup table来完成:

直接查找的完整范围列表:

  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;