我想过滤双值列表 我希望此列表中的项目数量大于或等于 比随机值
当我在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%的样本。
我不明白我的代码的第一个版本是怎么回事
答案 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);
你总是使用相同的值来进行比较。