Классическая ловушка — веса заданы через float и суммируются с погрешностью:
float[] weights = { 0.1f, 0.3f, 0.6f }; // кажется, сумма = 1.0
// На самом деле: 0.99999994f из-за float-арифметики
Если ты делишь на сумму для нормализации — погрешность накапливается. Последний элемент может никогда не выпасть или выпадать чуть реже.
Два способа починить:
1. Используй int-веса — целые числа не теряют точность:
int[] weights = { 60, 30, 10 }; // вместо 0.6f, 0.3f, 0.1f
2. Последний элемент — всегда fallback, а не результат сравнения:
for (int i = 0; i < weights.Length; i++)
if (roll < cumulative[i]) return i;
return weights.Length - 1; // если погрешность съела край — возвращаем последний
Маленькая деталь — но именно такие баги живут в проде годами и порой приводят к непредсказуемым последствиям.
#мат_геймдев #ОшибкаНедели #рандом