Линейный поиск — O(n). На 10 000+ предметов уже заметно тормозит. Бинарный — O(log n), и на больших таблицах разница становится огромной.
Один раз считаем в
Start():
int[] cumulative = new int[weights.Length];
cumulative[0] = weights[0];
for (int i = 1; i < weights.Length; i++)
cumulative[i] = cumulative[i - 1] + weights[i];
При каждом дропе — только поиск:
int roll = Random.Range(0, cumulative[^1] + 1);
int idx = System.Array.BinarySearch(cumulative, roll);
if (idx < 0) idx = ~idx;
~ — оператор побитового НЕ. BinarySearch возвращает отрицательное число, если точного совпадения нет — это ~insertionPoint, где insertionPoint — индекс, куда вставилось бы значение. ~idx обращает это обратно и даёт первый элемент, который больше нашего броска. Именно он нам и нужен.На 5 предметах разницы нет. На 10 000 — ощутимо.
Главное правило: кэшируй массив при старте, не пересчитывай каждый раз.
#мат_геймдев #БыстрыйМат #рандом #оптимизация