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

0 c# random lambda

我想过滤双精度值列表 我想要此列表中大于或等于随机值的项目数

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

不起作用的代码:

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();
Run Code Online (Sandbox Code Playgroud)

输出: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();
Run Code Online (Sandbox Code Playgroud)

输出:443 48 509

如您所见,48 确实代表了样本的 5%。

我不明白我的代码的第一个版本发生了什么

Fru*_*erg 5

问题出在这一行:

int index = vecteur.FindIndex(a => a > r.NextDouble());
Run Code Online (Sandbox Code Playgroud)

r.NextDouble()每次 LINQ 进行检查时(很多次),查找索引都会再次调用。a > r.NextDouble()只不过是LINQ 用于检查索引是否匹配的(匿名)函数。这意味着每次比较都是使用新的随机值完成的。如果你发现索引像

double b = r.NextDouble();
int index = vecteur.FindIndex(a => a > b);
Run Code Online (Sandbox Code Playgroud)

您始终使用相同的值进行比较。