@Arten00

Как из листа взять все числа в случайном порядке, без повторений?

Думал, что это как вариант, но почему то значения в r1 r2 другие, хоть и приближенные, а r3 всегда равен min
numbers = new List<float>() { min, mid, max };

        r1 = Random.Range(numbers[0], numbers[2]);
        numbers.Remove(r1);
        r2 = Random.Range(numbers[0], numbers[1]);
        numbers.Remove(r2);
        r3 = numbers[0];
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
почему то значения в 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 всегда вернет актуальное значение размера. его нельзя использовать в качесве индекса. но нас только что заверили, что рандомайзер не возвращает верхнюю грницу. значит такой код и короче и корректнее
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы