我想过滤双精度值列表 我想要此列表中大于或等于随机值的项目数
当我在 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%。
我不明白我的代码的第一个版本发生了什么
问题出在这一行:
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)
您始终使用相同的值进行比较。