Рандом с одинаковыми соотношениями

111
05 февраля 2022, 22:00

Есть вот такой код.

(int Chance, ThingType prize)[] chances =
    {
            (Chance: 50, prize: ThingType.Keg),
            (Chance: 50, prize: ThingType.Health),
    };
    int chance = Random.Range(0, 100) + 1;
    for (int index = 0; index < chances.Length; index++)
    {
        var pair = chances[index];
        if (chance <= pair.Chance)
            return pair.prize;
    }
    return ThingType.Chest;

Он позволяет выбрать случайный приз исходя из того, что все вероятности совокупно образуют 100.

Но, если в этом массиве кортежей есть вещи с одинаковым шансом, то получается что будет железно выпадать первая по списку - в данном случае это ThingType.Keg и никогда - вторая по списку, т.е. ThingType.Keg

Как написать чтобы он мог успешно обрабатывать массивы кортежей с равными и неравными вероятностями? Ну т.е. ожидается что то примерно такое

на вход

(int Chance, ThingType prize)[] chances =
    {
            (Chance: 70, prize: ThingType.Gold)
            (Chance: 30, prize: ThingType.Kind),
            (Chance: 50, prize: ThingType.Keg),
            (Chance: 50, prize: ThingType.Health),
    };

На выходе - с 35% шансом вернет ThingType.Gold с 15% шансом вернет ThingType.Kind с 25% шансом вернет ThingType.Keg с 25% шансом вернет ThingType.Health

Но что то одно должно вернуть точно

Answer 1

Он позволяет выбрать случайный приз исходя из того, что все вероятности совокупно образуют 100.

Нет, он этого не делает.

double total = sum of all Chance values;
int chance = Random.Range(0, 100) + 1;
int current = 0;
for (int index = 0; index < chances.Length; index++)
{
    var pair = chances[index];
    current = current + pair.Chance / total * 100;
    if (chance <= current)
        return pair.prize;
}
READ ALSO
ASP .NET Core MVC: как правильно использовать Partial View?

ASP .NET Core MVC: как правильно использовать Partial View?

Помогите, пожалуйста, разобраться с проблемой вызова Partial View

107
Ввод данных в поле EO.WebBrowser C#

Ввод данных в поле EO.WebBrowser C#

Всех приветствуюМне нужно вводить определенные данные в текстовые поля сайта после загрузки страницы

73
C# вызвать переменную из другого метода

C# вызвать переменную из другого метода

подскажите пожалуйста, мне нужно вызвать public class CallSKP из другого метода, чтоб использовать там значение переменной "text"как это сделать?

89
Искажение данных в JS функции (razorpage, asp.net core 3.0)

Искажение данных в JS функции (razorpage, asp.net core 3.0)

Существует метод контроллера:

104