2016-11-11 2 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; 
    } 
} 
Смежные вопросы