Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/432: Рейтинг темы: голосов - 432, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 17.10.2010
Сообщений: 15

Генератор случайных чисел - Без повторений

27.11.2010, 17:30. Показов 88636. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно сгенерировать 10 случайных цифр из 20. Без повторений.
и записать их в масив
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2010, 17:30
Ответы с готовыми решениями:

Генератор случайных чисел без random
Здравствуйте, надеюсь на вашу помощь. Нужно сделать ГСЧ в С# но не использовать при этом команду random. Много искал в инете, но ни чего не...

Генерация случайных значений без повторений
Всем привет! У меня проблема, надо рандомно раскидать 4 переменных без повторений, как это можно реализовать? Пока попробовал так, но прога...

Генератор случайных чисел
Здравствуйте, помогите пожалуйста переделать код из си в C# ( ((float)rand() / (float)RAND_MAX) - 0.5) Добавлено через 4 минуты ...

30
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.03.2015, 11:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от timeforlive Посмотреть сообщение
Я пользуюсь своей.
Не в обиду будет сказано, но я даже не знаю с чего начать описывать все ужасы предложенного алгоритма.
0
6 / 6 / 0
Регистрация: 22.08.2014
Сообщений: 4
22.11.2015, 23:17
C#
1
2
3
       
System.Random random = new System.Random();
 var mas = Enumerable.Range(0, 9).OrderBy(n => random.Next()).ToArray();
Все проще, чем кажется...
0
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 1
25.02.2020, 16:17
Посмотрел я ваши варианты, они меня не устраивают по следующим причинам:
1. Циклом проходить по массиву имеющихся значений это ерунда, потому что это лишние операции, которые можно не делать.
2. Обычный массив int[] не выгодно, потому что с динамическим изменением все туго у него.
timeforlive привел свой пример, который очень громоздкий и DateTime совсем пользы не принесет.
Я предлагаю свой вариант, только щас придумал. Создаются 2 массива. Один - исходный, второй - рабочий. Рабочий массив является копией исходного, он один раз перемешивается полностью, потом первый элемент массива является числом для возврата. Удаляем этот самый элемент, мы его узнали. Дальше это число не будет фигурировать в этом списке. И так мы перебираем все числа, пока не станет их 0. Можно продолжить этот перебор, потому что стоит условие "если число переменных = 0, то Рабочий_Массив = Исходный_Массив", то есть мы копируем оригинал снова.
Проверил, работает замечательно, никаких повторений в перечислении и минимум действий программы.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class TrueRandom
    {
        static Random rnd = new Random();
        private List<int> Исходный_Массив = new List<int>();
        private List<int> Рабочий_Массив;
 
        public void Gen(int min, int max) //основной метод генерации чисел. от минимального до максимального числа перебор
        {
            for (int i = min; i <= max; i++)
            {
                Исходный_Массив.Add(i);
            }
            Рабочий_Массив = new List<int>(Исходный_Массив);
        }
 
        public void Gen(List<int> Numbers) //доп. метод, перебор ваших чисел, напр., Gen(new List<int>(){3,5,7,23,15,16});
                                                             //так будут перебираться эти 6 чисел
        {
            foreach (var Num in Numbers)
            {
                Исходный_Массив.Add(Num);
            }
            Рабочий_Массив = new List<int>(Исходный_Массив);
        }
 
        public int Next() //просто получаем готовое рандомное число
        {
            int Число_Для_Возврата = 0;
            if(Рабочий_Массив.Count==0) { Рабочий_Массив = new List<int>(Исходный_Массив); }
            Shuffle(Рабочий_Массив);
            Число_Для_Возврата = Рабочий_Массив.First();
            Рабочий_Массив.Remove(Рабочий_Массив.First());
            return Число_Для_Возврата;
        }
 
        public static void Shuffle<T>(IList<T> list) //перемешивание массива
        {
            int n = list.Count;
            while (n > 1)
            {
                n--;
                int k = rnd.Next(n + 1);
                T value = list[k];
                list[k] = list[n];
                list[n] = value;
            }
        }
    }
Протестировав в консольном приложении, в главном классе написав:
C#
1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
        {
            var truernd = new TrueRandom();
            truernd.Gen(new List<int>(){3,5,7,23,15,16});
            for (;;)
            {
                if (Console.ReadLine() != null)//жмем enter и получаем число, бесконечный цикл
                {
                    Console.Write(truernd.Next());
                }
            }
        }
Мы получил неповторяющуюся рандомную последовательность чисел из 3,5,7,23,15,16
А если написать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
        {
            var truernd = new TrueRandom();
            truernd.Gen(1,20);
            for (;;)
            {
                if (Console.ReadLine() != null)//жмем enter и получаем число, бесконечный цикл
                {
                    Console.Write(truernd.Next());
                }
            }
        }
То получим неповторяющуюся последовательность от 1 до 20
Расписал как можно подробнее, потому что такого рода вопросы задают совсем уж начинающие.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
25.02.2020, 19:11
wolfman151515, вряд ли ждали вашего ответа пять лет....

И ваш вариант...., мягко выражаясь, изрядно переосложнён.
Типовая реализация для подобных случаев показана Warped постом выше.
0
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 710
18.03.2020, 15:13
А как сгенерировать в одну строчку без циклов последовательности с допуском повторений значений?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
18.03.2020, 16:52
Цитата Сообщение от Ваю Посмотреть сообщение
А как сгенерировать в одну строчку без циклов последовательности с допуском повторений значений?
Если в рамках этой темы, то есть из чисел диапазона 1...20 последовательность длиной десять.
C#
1
2
Random rand =  new Random();
int[] nums = Enumerable.Range(0,10).Select(n => rand.Next(20) + 1).ToArray();
1
0 / 0 / 0
Регистрация: 06.12.2021
Сообщений: 3
08.01.2022, 12:08
C#
1
2
3
4
5
6
7
8
9
for (int i = 0; i < array.Length; i++)
                {
                    int num = random.Next(finalValue);
                    if (Array.IndexOf(array, num) == -1)
                    {
                        array[i] = num;
                    }
                    else i--;
                }
0
 Аватар для VyachNik
51 / 51 / 35
Регистрация: 16.02.2016
Сообщений: 289
15.07.2024, 15:14
Warped, в вашем варианте всего 9 цифр (от 0 до 8 включительно), а в задании нужно 10 цифр из 20 возможных;
самый короткий вариант в одну строчку:
C#
1
2
3
4
void Main()
{
    int[] numbers = Enumerable.Range(1, 20).OrderBy(x => Guid.NewGuid()).Take(10).ToArray();
}
с проверкой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
void Main()
{
    {
        int[] numbers = Enumerable.Range(1, 20).OrderBy(x => Guid.NewGuid()).Take(10).ToArray();
        
        Console.WriteLine("Случайные числа из 10 цифр из 20 без повторений:");
        foreach(int num in numbers)
        {
            Console.Write(num + " ");
        }
    }
}
0
1800 / 1782 / 173
Регистрация: 25.07.2015
Сообщений: 2,900
15.07.2024, 16:41
Цитата Сообщение от VyachNik Посмотреть сообщение
Warped, в вашем варианте всего 9 цифр (от 0 до 8 включительно)
Ну вообще-то 10
Цитата Сообщение от Warped Посмотреть сообщение
C#
1
var mas = Enumerable.Range(0, 9).OrderBy(n => random.Next()).ToArray();
И да... всего-то 9 лет прошло ))))
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
15.07.2024, 22:50
Цитата Сообщение от Kulma Посмотреть сообщение
Ну вообще-то 10
Девять.
C#
1
2
3
4
    var mas = Enumerable.Range(
        0, // Начальное число последовательности
        9) // КОЛИЧЕСТВО генерируемых чисел
        .OrderBy(n => Random.Shared.Next()).ToArray();
2
 Аватар для VyachNik
51 / 51 / 35
Регистрация: 16.02.2016
Сообщений: 289
16.07.2024, 21:53
Цитата Сообщение от Kulma Посмотреть сообщение
Ну вообще-то 10
легко проверить:
Миниатюры
Генератор случайных чисел - Без повторений  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.07.2024, 21:53

Генератор случайных чисел
Написал программу для генерирования случайных чисел через линейный конгруэнтный метод. Как можно сделать тест на однородность и вообще ли...

Генератор случайных чисел
Здравствуйте! У меня большая просьба. Вот инициализация генератора случайных чисел. Прокомментируйте пожалуйста каждую строчку в нем, ну,...

Генератор случайных чисел в C#
Как пользоваться генератором случайных чисел? Прочитала вот такое: 1. System.Random Пожалуй, самый простой способ получить “вполне...

Генератор случайных букв и чисел
1 случайное число = x 1 случайная буква = d помогите написать код textBox1.Text = &quot;блабла&quot; + d + x + x + d + x

Генератор строго случайных чисел
Требуется сабж. Стандартная функция рандома не канает, даже с заданным параметром (время в мс к примеру) ибо слишком часто вызывается....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru