【问题标题】:C# and "Weighted probability" [duplicate]C# 和“加权概率”[重复]
【发布时间】:2016-11-11 09:26:36
【问题描述】:

我希望从一个人列表中挑选一个人,其中列表中的每个项目都有一定的“权重”。假设 Person 类有必要的构造函数。

public class Person {
    public string Name { get; set; }
    public float Weighting { get; set; }
}

public List<Person> People = new List<Person>();

People.Add(new Person("Tim", 1.0));
People.Add(new Person("John", 2.0));
People.Add(new Person("Michael", 4.0));

现在,我想从这个列表中随机选择一个人。但平均而言,我选择迈克尔的次数比蒂姆多 4 倍。而且我想像迈克尔一样经常选择约翰一半(2/4)。当然,我想像约翰一样经常选择迈克尔。

这有意义吗?

我已经有了根据百分比选择人员的代码。如果我只是将它们的 %chance 乘以本示例中提供的权重,它不会起作用吗?

另外,我目前的系统只能在高达 100% 的情况下工作,以上都没有。有关如何克服此限制的任何建议?我可能不得不根据列表中最大的因素来衡量每个机会?

public static bool Hit(double pct) {
    if (rand == null)
        rand = new Random();

    return rand.NextDouble() * 100 <= pct;
}

还是我错过了什么?

【问题讨论】:

  • 你的问题有点含糊,不太适合这个论坛,但我看不出你建议的方法有什么问题。建议您先尝试一些东西,然后如果它不起作用,您可以回到这里(或更合适的论坛)并就特定编码问题提出特定问题。

标签: c# math statistics probability


【解决方案1】:

你没有从一开始就保留百分比。

我会在 0 到所有 Weighting 值的总和之间创建一个随机数。然后只需遍历列表并检查该值是否低于当前加上自身的重量。

所以:

float r = YourRandomNumber(People.Sum(p => p.Weighting));
float sum = 0;

foreach (Person p in People)
{
    if (r < (sum + p.Weighting))
    {
        // hit
        // save the person somewhere
        break;
    }
    else
    {
        sum += p.Weighting;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多