У меня есть скрипт, который я использую для выбора случайного элемента из массива с взвешенным шансом, и по большей части он работает хорошо. Проблема возникает, когда индекс достигает последнего элемента в массиве.
Вот мой код:
string[] grades = { "D", "C", "B", "A", "S" };
int[] weights = { 80, 140, 170, 180, 181 };
// 80, 60, 30, 10, 1
int iterations = 100;
void Update() {
if (iterations > 0) {
string genGrade = grades[WeightedChance(weights)];
print("Chance: " + chance + ", Grade: " + genGrade);
iterations--;
}
}
int WeightedChance(int[] weights) {
float weightSum = weights[weights.Length - 1];
float chance = Random.Range(0f, weightSum);
for (int i = 0; i < weights.Length - 1; i++) {
if (chance <= weights[i]) {
return i;
}
}
return -1;
}
Из того, что я понимаю, когда i
добирается до последнего элемента в массивекажется, что он пропускается, а затем запускается return -1
, давая мне «IndexOutOfRangeException». Кажется, я не могу понять, почему именно это происходит. chance
генерирует число от 0f
до weightSum
(или 181
в данном случае), оба включаются, поскольку они являются числами с плавающей точкой. После этого я проверяю каждый элемент в weights
и проверяю, меньше или равно число, сгенерированное chance
, каждому из них. Если все это работает так, как я думаю, то должно быть всегда возможно выбрать один из весов, но что-то идет не так, когда i
достигает 4
(по крайней мере, это то, что я предполагаю). Я новичок во всем этом, поэтому я прошу прощения, если я пропустил что-то важное или мой код не отформатирован правильно.