2016-11-11 141 views
0

我期待從列表中選擇1個人,其中列表中的每個項目都有一定的「權重」。假設Person類具有必要的構造函數。C#和「加權概率」

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)。當然,我想像約翰那樣經常選擇邁克爾。

這是否有意義?

我已經有代碼來根據百分比選擇人員。如果我只是通過這個例子中提供的權重乘以百分比的機會,它會不會奏效?

此外,我目前的系統只有的機會高達100%,沒有任何上述的。有關如何克服這一限制的任何建議?根據列表中最大的因素,我可能不得不擴大每個機會?

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

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

或者我錯過了什麼?

+0

你的問題是有點含糊,並沒有真正適合這個論壇,但我看不出什麼錯了你的建議方案。建議您先嚐試一下,然後如果它不起作用,您可以回到這裏(或更合適的論壇),並詢問關於特定編碼問題的具體問題。 – LordWilmore

回答

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; 
    } 
}