2016-11-11 3 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倍多く選んでいます。そして私はマイケルと同じくらい頻繁にJohn half(2/4)を選びたい。もちろん、ミハエル・ダブルをジョンと同じくらい頻繁に選びたいと思う。

これは意味がありますか?

私はすでにパーセンテージに基づいて人々を選択するためのコードを用意しています。この例で提供されている重み付けで%確率を乗算しただけではうまくいかないでしょうか?

また、私の現在のシステムでは、のチャンスが100%までしかありません。この制限を克服する方法に関するアドバイスはありますか?私はおそらく、リストの中で最も大きな要素に応じてあらゆる機会を拡大しなければならないだろうか?

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

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

何か不足していますか?

+0

あなたの質問は少し漠然としており、このフォーラムのために本当に適していませんが、私はあなたの提案のアプローチに何かを見ることはできません。最初に何かを試してみることをお勧めします。もしうまくいかない場合は、ここ(あるいはより適切なフォーラム)に戻って特定のコーディングの問題について具体的な質問をすることができます。 – LordWilmore

答えて

1

あなたは、まずパーセントを維持していません。

私はすべての数字がWeightingの合計で0の範囲の乱数を作成します。次に、リストの上を歩いて、その値が現在の自重よりも小さいかどうかを確認します。

ので:

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