Рандомный выбор из определенных чисел

s.pushkov

Client
Регистрация
07.10.2020
Сообщения
12
Благодарностей
6
Баллы
3
Здравствуйте! Всю голову сломал, задача: Есть определенные числа с кратностью 6 (100,106,112,118,124), каким образом можно через кубик или сниппет рандомно брать число из этого списка и передавать значение в переменную random, чтобы ее уже использовать для дальнейшего сравнения. Подскажите пожалуйста выход, или хотя бы куда копать. Спасибо!
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 524
Благодарностей
1 321
Баллы
113
Здравствуйте! Всю голову сломал, задача: Есть определенные числа с кратностью 6 (100,106,112,118,124), каким образом можно через кубик или сниппет рандомно брать число из этого списка и передавать значение в переменную random, чтобы ее уже использовать для дальнейшего сравнения. Подскажите пожалуйста выход, или хотя бы куда копать. Спасибо!
Операция над списком - получить строку - случайную.
 

s.pushkov

Client
Регистрация
07.10.2020
Сообщения
12
Благодарностей
6
Баллы
3
Да, спасибо, единственный вопрос, список созданный в PM будет сохранен при работе в ZP? или лучше создавать файлы .txt и указывать ссылкой на файл при формировании списка? Может кто через код знает как сделать? Спасибо!
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Есть определенные числа с кратностью 6 (100,106,112,118,124),
каким образом можно через кубик или сниппет рандомно брать число из этого списка
и передавать значение в переменную random
C#:
List<int> list = new List<int>(); // создаем список
list.AddRange(new int[]{100,106,112,118,124}); // добавляем массив чисел
list.Add(94); // добавляем число
list.Add(int.Parse("130")); // Добавляем строку
// закоментировать или изменить под свои задачи лишние строки

int random = list.OrderBy(x => Guid.NewGuid()).Take(1).ToList()[0]; // Берем случайное значение
return random; // вернём с кубика - галку поставить в какую переменную вернуть результат
 
Последнее редактирование:
  • Спасибо
Реакции: djaga, Alexmd и s.pushkov

s.pushkov

Client
Регистрация
07.10.2020
Сообщения
12
Благодарностей
6
Баллы
3
Всем огромное спасибо за помощь!
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Видимо в этой теме мне нужно сделать оговорку.
Пользователь форума, Alexmd, задал вопрос в личку почему я предоставил в этой теме не оптимальное решение.
И, он совершенно прав!

Вполне ожидаемым должен был бы быть код примерно такой:
Получаем случайную строчку из списка:
Random rand = new Random();
List<int> list = new List<int>{ 100,106,112,118,124};
return list[rand.Next(list.Count)];
Сравнение вариантов:
C#:
project.SendInfoToLog(string.Format("Старт"));
System.Diagnostics.Stopwatch stopWatch = System.Diagnostics.Stopwatch.StartNew();
Random rand = new Random();
int num = -1;
int item = 1000;
List<int> list = new List<int>(); // создаем список
stopWatch.Stop();
project.SendInfoToLog(string.Format("Создание объектов: {0:c}", stopWatch.Elapsed));

project.SendInfoToLog(string.Format("Старт"));
stopWatch = System.Diagnostics.Stopwatch.StartNew();
for(int i=0;i<item;i++) list.Add(i); // добавляем число
stopWatch.Stop();
project.SendInfoToLog(string.Format("Наполнение списка: {0:c} итерация: {1}", stopWatch.Elapsed, item));

project.SendInfoToLog(string.Format("Старт"));
stopWatch = System.Diagnostics.Stopwatch.StartNew();
num = list.OrderBy(x => Guid.NewGuid()).Take(1).ToList()[0]; // Берем случайное значение
stopWatch.Stop();
project.SendInfoToLog(string.Format("Создание случайных строк + сортировка + выборка первого: {0:c}", stopWatch.Elapsed));

project.SendInfoToLog(string.Format("Старт"));
stopWatch = System.Diagnostics.Stopwatch.StartNew();
num = list[rand.Next(list.Count)];
stopWatch.Stop();
project.SendInfoToLog(string.Format("Выборка случайного: {0:c} ms", stopWatch.Elapsed));
В целом, для маленьких списков/массивов (как в шапке темы) я использую обычно именно этот вариант, из-за чего его и указал.
С одной стороны я ленивый - написать Random r = new Random() это много символов.
С другой стороны когда я использую где-то AsParallel и нужно вытащить случайное значение из 4-5 элементов на каждой итерации - то стандартный рандом там не подходит (внутреннее состояние может быть нарушено) - а создание его экземпляра в каждом потоке многопотока - мне кажется, что лучше всё же создавать новый guid.

Не претендую на истину в первой инстанции.
Однозначно, прежде чем копировать и вставлять код нужно каждую строчку тщательно изучить в документации.
 
  • Спасибо
Реакции: Alexmd и djaga

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Пользователь форума, @Alexmd, задал вопрос в личку почему я предоставил в этой теме не оптимальное решение.
надо было ответить, что ты оставил такую возможность специально для него)
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
надо было ответить, что ты оставил такую возможность специально для него)
Я не в упрёк - мы часто обсуждаем подобные моменты - иногда я спрашиваю, почему он принял такое решение в каком-то конкретном случае, иногда он меня. Просто раз уже затронули эту тему, то нужно было отписаться здесь - чтобы другие смогли почитать и понять, что я намерено использовал данный вариант, но он не является оптимальным.
 
  • Спасибо
Реакции: Alexmd

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
Я скажу так: по большому счету людям наплевать, как отрабатывает сниппет, которым им помогли на форуме БЕСПЛАТНО.
Поэтому не стал писать об этом в ветке, но я безмерно рад, что могу обсудить с Вами подобные вопросы и учиться, учиться и еще раз учиться)
 
  • Спасибо
Реакции: BAZAg

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)