使用随机的c#lambda表达式的奇怪行为

时间:2017-06-13 20:29:20

标签: c# random lambda

我想过滤双值列表 我希望此列表中的项目数量大于或等于 比随机值

当我在lambda表达式中使用随机函数的项目数 发现与预期数量不符。当我将随机函数放在lamda表达式之外时,代码正常工作 这里不是工作版本vs工作版本

没有正常工作的代码:

List<double> vecteur = new List<double> { 0.45, 0.5, 1 };
List<int> lstcompteurs = new List<int> { 0,0,0};
Random r = new Random();
for (int i = 0; i < 1000; i++) {                
     int index = vecteur.FindIndex(a => a > r.NextDouble());
     lstcompteurs[index]++;    
}
foreach (int cpt in lstcompteurs) {
   Console.WriteLine(cpt);
}
Console.Read();

输出: 448 288 264

我们注意到288代表了超过5%的样本。

工作代码:

List<double> vecteur = new List<double> { 0.45, 0.5, 1 };
List<int> lstcompteurs = new List<int> { 0,0,0};
Random r = new Random();
for (int i = 0; i < 1000; i++) {
   double b = r.NextDouble();
   int index = vecteur.FindIndex(a => a > b);
   lstcompteurs[index]++;    
}
foreach (int cpt in lstcompteurs) {
    Console.WriteLine(cpt);
}
Console.Read();

输出: 443 48 509

如您所见,48表示确实有5%的样本。

我不明白我的代码的第一个版本是怎么回事

1 个答案:

答案 0 :(得分:4)

问题出在这一行:

int index = vecteur.FindIndex(a => a > r.NextDouble());

每次LINQ进行检查时(非常多次),查找索引将再次调用r.NextDouble()a > r.NextDouble()只不过是LINQ用于检查索引是否匹配的(anonymous)函数。这意味着每个比较都使用新的随机值。如果找到像

这样的索引
double b = r.NextDouble();
int index = vecteur.FindIndex(a => a > b);

你总是使用相同的值来进行比较。