如何以特定概率遍历列表?

How can I traverse a list with specific probability?

假设,我有一个列表:

List<Point2d> listOfCoordinates = new List<Point2d>();

假设,这个列表有 15 个元素。 IE。 listOfCoordinates.Count == 15.

假设,我想以特定概率打印列表中的项目。 IE。如果我 运行,比如说,1000 次迭代,1st 五个元素应该在 30% 的时间内打印(概率 = 0.30); middle 五个元素应该打印 50% 的时间(概率 = 0.50),last 五个元素应该打印 20% 的时间时间(概率 = 0.20)。

请记住,概率以双精度值存储在 Point2d class 中。即

class Point2d
{
    public double X, Y, Probability;
}

因此,我无法操纵循环语句来实现此目的。

我怎样才能 运行 一个 foreach 循环来实现这个?

假设打印每个 Point2d 是一个独立事件,概率为 Probability,并且您有一个列表,例如:

var list = new List<Point2d> {
    // first 5 all have probability 0.3
    new(1, 2, 0.3),
    new(3, 4, 0.3),
    new(5, 6, 0.3),
    new(7, 8, 0.3),
    new(9, 10, 0.3),
    // middle 5 all have probability 0.5
    new(11, 12, 0.5),
    new(13, 14, 0.5),
    new(15, 16, 0.5),
    new(17, 18, 0.5),
    new(19, 20, 0.5),
    // last 5 all have probability 0.2
    new(21, 22, 0.2),
    new(23, 24, 0.2),
    new(25, 26, 0.2),
    new(27, 28, 0.2),
    new(29, 30, 0.2)
};

你可以这样打印出来:

void Print(List<Point2d> list, Random random) {
    foreach (var point in list) {
        if (random.NextDouble() < point.Probability) {
            Console.WriteLine(point);
        }
    }
}

注意NextDouble returns0(含)和1(不含)之前的值。

进行 1000 次迭代将得到大约 5000 行:

var random = new Random();
for (int i = 0 ; i < 1000 ; i++) {
    Print(list, random);
}