почему то значения в r1 r2 другие, хоть и приближенные
правильно
Random.Range(numbers[0], numbers[2]);
никогда (или с очень малой веорятностью) не вернет ни
numbers[0]
, ни
numbers[2]
. вы же задаете их как
границы диапазона будущего случайного значения. обычно вы получите действительно значение где то между границ
немого забегая вперед, раз уж у вас cлучайное значение, то
numbers.Remove(r1);
скорее всего ни чего не удаляет из списка. для удаления надо укзать значение, которое там действительно существует
а r3 всегда равен min
естественно (причины выше, вы никогда, ни чего не удаляе из списка)
numbers = new List<float>() { min, mid, max };
...
r3 = numbers[0];
вероятно вам надо что то в этом духе
numbers = new List<float>() { min, mid, max };
// тут без изменений
// далее различаем индексы и сами значения
i1 = Random.Range(0, numbers.Count-1);
r1 = numbers[i1]
numbers.RemoveAt(i1);
// ну или как вариант
i_n = Random.Range(0, numbers.Count-1);
r_n = numbers[i_n]
numbers.Remove(r_n);
// как видите, ни одной строки не убавилось. а удаление по индексу точно быстрее
// полную совместимость с Unity это уж сами проверьте
// естественно n ни когда не должно превышать исходного размера списка
// и еще - средства раскраски синтаксиса напомнили in это зарезервированное
// ключевое слово ;))
ps и хочу предупредить - я не в курсе как в юнити с авто приведениями типов. беглое гугление, поазало, что
Random.Range()
возвращает
float
, а в качестве индекса должно использоваться
int
. в традиционном дотнете, приведение местами пойдет автоматически, но где то придется использовать явные приемы приведения типов
pps
freeExec, в каментах, утрверждает что верхняя граница ни когда не возваращается рандомайзером
если это действительно так, можео смело шпарить
...i_n = Random.Range(0, numbers.Count);
на любой фазе. ведь
numbers.Count
всегда вернет актуальное значение размера. его нельзя использовать в качесве индекса. но нас только что заверили, что рандомайзер не возвращает верхнюю грницу. значит такой код и короче и корректнее