c#で書いた重みづけ抽選関数。タプルを利用しています。
シンプルなので使いやすいかと。
RandomPickWithWeight.cs
int RandomPickWithWeight(List < (int id, float weight) > lst) {
var sum = 0f;
foreach (var l in lst) {
sum += l.weight;
}
var lot = Random.value * sum;
sum = 0f;
foreach (var l in lst) {
sum += l.weight;
if (sum >= lot) {
return l.id;
}
}
return lst[0].id;
}
準備しておく重みづけ付き抽選対象の例。
RewardData.cs
enum REWARD_TYPE {
Rarecoin,
Ticket,
XP
}
List < (int id, float weight) > _rewardsWeight = new List < (int id, float weight) > {
((int)REWARD_TYPE.Rarecoin, 30f),
((int)REWARD_TYPE.Ticket, 10f),
((int)REWARD_TYPE.XP, 5f),
};
上記例に書いたListを関数に食わせるとintを返すので(REWARD_TYPE)にcastすると扱いやすい答えが得られます。