2014-09-25 30 views
0

我所做的是从列表中选取一个随机项目。然后,我需要根据列表中的总项目等待一段时间。算法:根据总数挑选一个随机数

例如;如果列表中有20个项目,请在1秒到2秒之间等待。 如果列表中有10个项目,请在1到3秒之间等待较高的项目。 如果列表中有1或2个项目,请在5到10秒之间等待。 这些数字,我刚刚编造,但你得到的主旨。更多的项目=选择更快的等待时间;减少项目,选择更长的等待时间。

我想知道是否有一个更优雅的方式在.NET中这样做,而不必使用800块如果块来实现这一点。

+0

您可以执行'Thread.Sleep((1/NumberOfItems)* SomeMagicNumber)'。 – 2014-09-25 08:25:46

+0

感谢您的帮助阿列克谢。我不确定为什么这是关闭的话题。这是一个真正的问题,我肯定不能成为第一个遇到的问题。列出的原因也是无稽之谈。 – 2014-09-26 00:46:03

+0

@DmitriTrofimov:这不是一个坏主意(减去睡眠部分),谢谢你。 – 2014-09-30 00:00:35

回答

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;