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

使用随机变量的c#lambda表达式的奇怪行为,c#,random,lambda,C#,Random,Lambda,我想筛选双值列表 我希望此列表中的项目数大于或等于 而不是一个随机值 当我在lambda表达式中使用随机函数时,项目数 founds与预期金额不符。当我把随机函数放在lamda表达式之外时,代码工作正常 这里是非工作版本与工作版本 非工作代码: List<double> vecteur = new List<double> { 0.45, 0.5, 1 }; List<int> lstcompteurs = new List<int> { 0,0,

我想筛选双值列表 我希望此列表中的项目数大于或等于 而不是一个随机值

当我在lambda表达式中使用随机函数时,项目数 founds与预期金额不符。当我把随机函数放在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();
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();
List-vecteur=新列表{0.45,0.5,1};
List lstcompters=新列表{0,0,0};
随机r=新随机();
对于(int i=0;i<1000;i++){
int index=vecteur.FindIndex(a=>a>r.NextDouble());
l计算机[索引]+;
}
foreach(在LSTCompers中的int cpt){
控制台写入线(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++) {                
     int index = vecteur.FindIndex(a => a > r.NextDouble());
     lstcompteurs[index]++;    
}
foreach (int cpt in lstcompteurs) {
   Console.WriteLine(cpt);
}
Console.Read();
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();
List-vecteur=新列表{0.45,0.5,1};
List lstcompters=新列表{0,0,0};
随机r=新随机();
对于(int i=0;i<1000;i++){
双b=r.NextDouble();
int index=vecteur.FindIndex(a=>a>b);
l计算机[索引]+;
}
foreach(在LSTCompers中的int cpt){
控制台写入线(cpt);
}
Console.Read();
输出: 443 48 509

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


我不明白我的代码的第一个版本发生了什么问题,问题出在这一行:

int index = vecteur.FindIndex(a => a > r.NextDouble());
每次LINQ进行检查时(很多次),查找索引将再次调用
r.NextDouble()
a>r.NextDouble()
就是LINQ用来检查索引是否匹配的()函数。这意味着每次比较都使用一个新的随机值进行。如果你发现索引像

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

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

问题出在这一行:

int index = vecteur.FindIndex(a => a > r.NextDouble());
每次LINQ进行检查时(很多次),查找索引将再次调用
r.NextDouble()
a>r.NextDouble()
就是LINQ用来检查索引是否匹配的()函数。这意味着每次比较都使用一个新的随机值进行。如果你发现索引像

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

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

非常感谢我们刚刚发现调试器的问题非常感谢我们刚刚发现调试器的问题