Есть вот такой код.
(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
Но что то одно должно вернуть точно
Он позволяет выбрать случайный приз исходя из того, что все вероятности совокупно образуют 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;
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости