Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/88: Рейтинг темы: голосов - 88, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 22.12.2014
Сообщений: 210

Генерация случайных чисел без повторений

06.01.2015, 21:49. Показов 17093. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая:Заполнить массив (из 10 элементов) случайными числами от 10 до 50, без повторений. Вывести элементы массива на форму. Расположить элементы массива по возрастанию.
Привожу код ниже. Как сгенерировать числа без повтора???? рекомендуется проверить условие: если элемент уже есть в массиве, то сгенерировать новое, а если нет, то добавить в массив

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
int[] ar = new int[10];
            Random rnd = new Random();
            string str = "";
            string str1 = "";
            int k;
            int x;
            for (int i=0;i<=9;i++)
            {
                ar[i]=rnd.Next(40)+10;
                str += ar[i] + ", ";
                k=i;
                x=ar[i];
                for (int j = i + 1; j <= 9; j++)
                {
                    if (ar[j] < x)
                    {
                        k = j;
                        x = ar[j];
                    }
                }
                ar[k] = ar[i];
                ar[i] = x;
                str1 += x + ", ";
            }
            label2.Text = str;
            label3.Text = str1;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2015, 21:49
Ответы с готовыми решениями:

Генерация случайных чисел
В общем нужен достаточно большой массив (скажем 8000 типа byte) случайных бит, причем нужна достаточно быстрая генерация (сейчас через...

Генерация массива случайных неповторяющихся чисел
Нужно сгенирировать массив случайных чисел. Предположим что массив размером 10000, а диапазон чисел от 1 до 1000000. Вариант брать...

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

15
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.01.2015, 23:21
Цитата Сообщение от kirill88 Посмотреть сообщение
Как сгенерировать числа без повтора????
Например так. Форма, на ней кнопка и листбокс.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication2 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click);
        }
 
        void button1_Click(object sender, EventArgs e) {
            Random r = new Random();
            Task<object[]>.Factory.StartNew(() => {
                List<object> objects = new List<object>();
                while (objects.Count != 10) {
                    int n = r.Next(10, 51);
                    if (!objects.Contains(n)) {
                        objects.Add(n);
                    }
                }
                return objects.OrderBy(o => o).ToArray(); ;
            }).ContinueWith(task => {
                listBox1.Items.Clear();
                listBox1.Items.AddRange(task.Result);
            }, TaskScheduler.FromCurrentSynchronizationContext());
        }
    }
}
1
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,234
07.01.2015, 04:09
kirill88,
по сложившейся традиции - "запасной вариант"
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
49
50
51
52
53
54
55
int[] ar = new int[10];
Random rnd = new Random();
// заполнение массива
int k = 0;
int x;
for (int i=0;k<10;i++)
{
  x = rnd.Next(40)+10;
  if k = 0    //добавление 1-го элемента массива
  {
    ar[k]= x;
    k = k + 1;
  }
  else  //добавление остальных элементов массива
  {
    int m = 0;
    for (int j=0;j<k;j++)  // проверка совпадений
    {
      if (ar[j] = x) m = m + 1; // счетчик совпадений
    }
    if (m = 0) // добавление нового элемента при отсутствии совпадений
    {
      ar [k] = x;
      k = k + 1;        
    }
  }
}
// вывод массива
string str = ar[0];
for (int i=1;i<10;i++)
{
  str += ", " + ar[i]; 
}
label2.Text = str;
// сортировка массива
int temp;
for (int i=0;i<10;i++)
{
  for (int j = 9; j > i; j--)
  {
    if (ar[j] < ar[j - 1])
    {
      temp = ar[j];
      ar[j] = ar[j - 1];
      ar[j - 1] = temp;
    }
  }
}  
// вывод отсортированного массива
string str1 = ar[0];
for (int i=1;i<10;i++)
{
  str1 += ", " + ar[i];
}
label3.Text = str1;
XRoy,
я помню как складывать строки, это - по "спецзаказу"
2
9 / 9 / 8
Регистрация: 25.12.2011
Сообщений: 44
08.01.2015, 14:53
Вот примерчик
C#
1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i < 10; i++)
            {
                a[i] = r.Next(0, 10);
                if (i > 0)
                    for (int j = 0; j < i; j++)
                        if (a[i] == a[j])
                        {
                            i--;
                            break;
                        }
            }
0
0 / 0 / 1
Регистрация: 22.12.2014
Сообщений: 210
08.01.2015, 18:45  [ТС]
i--;
break;
такого не проходили а ещё способ есть? методом вставки
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
08.01.2015, 19:17
Цитата Сообщение от kirill88 Посмотреть сообщение
такого не проходили
Что тут проходить то:
i--;, это сокращенная запись i=i-1;
break; в данном случае разрушает внутренний цикл, т.е. считается что цикл завершился.
Поверьте, если будете использовать только то, что проходили, далеко не уедите.
p.s. вот только примерчик у Massive не очень, очень медленный вариант.
0
0 / 0 / 1
Регистрация: 22.12.2014
Сообщений: 210
08.01.2015, 19:29  [ТС]
ок попробую) а вместо break что можно написать?
0
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,234
08.01.2015, 19:38
Цитата Сообщение от kirill88 Посмотреть сообщение
такого не проходили а ещё способ есть? методом вставки
kirill88,
а что, запасной вариант не подошел? Там, правда было несколько "ляпов", но в этом варианте работает:
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
49
50
51
52
53
54
55
int[] ar = new int[10];
Random rnd = new Random();
// заполнение массива
int k = 0;
int x;
for (int i=0;k<10;i++)
{
  x = rnd.Next(40)+10;
  if (k == 0)    //добавление 1-го элемента массива
  {
    ar[k]= x;
    k = k + 1;
  }
  else  //добавление остальных элементов массива
  {
    int m = 0;
    for (int j=0;j<k;j++)  // проверка совпадений
    {
      if (ar[j] == x) m = m + 1; // счетчик совпадений
    }
    if (m == 0) // добавление нового элемента при отсутствии совпадений
    {
      ar [k] = x;
      k = k + 1;        
    }
  }
}
// вывод массива
string str = ar[0].ToString();
for (int i=1;i<10;i++)
{
  str += ", " + ar[i]; 
}
label2.Text = str;
// сортировка массива
int temp;
for (int i=0;i<10;i++)
{
  for (int j = 9; j > i; j--)
  {
    if (ar[j] < ar[j - 1])
    {
      temp = ar[j];
      ar[j] = ar[j - 1];
      ar[j - 1] = temp;
    }
  }
}  
// вывод отсортированного массива
string str1 = ar[0].ToString();
for (int i=1;i<10;i++)
{
  str1 += ", " + ar[i];
}
label3.Text = str1;
0
0 / 0 / 1
Регистрация: 22.12.2014
Сообщений: 210
08.01.2015, 19:43  [ТС]
Дело в том, что нужно сделать так: проверить условие, что если такой элемент есть, то сгенерировать новое число,, а если нет, то добавить в массив, при этом использовать метод вставки
Алгоритм сортировки следующий (метод вставки):Вот так написано использовать, но как всё это собрать в одно целое не пойму(((

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i = 0; i<=9; i++)
{
        k = i;
        x = a[i]; // берем i-тый элемент для сравнения
        for (int j = i + 1; j<=9; j ++)
        {
                if (a[j] < x ) // сравнение с остальными элементами массива, поиск наименьшего
                {
                      k = j;
                      x = a[j];
                }
        }
        a[k] = a[i];
        a[i] = x; // меняем местами минимальный элемент со сравниваемым
}
0
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,234
08.01.2015, 21:03
Цитата Сообщение от kirill88 Посмотреть сообщение
Дело в том, что нужно сделать так: проверить условие, что если такой элемент есть, то сгенерировать новое число,, а если нет, то добавить в массив, при этом использовать метод вставки
То есть нужно обязательно одновременно вставлять и сортировать? А то просто замените в моем коде раздел "//сортировка массива" на свой код и всё.

Добавлено через 1 час 11 минут
Вроде получилось объединить, но тогда выводить придется только один массив, потому что он уже упорядочен:
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
49
int[] ar = new int[10];
Random rnd = new Random();
// заполнение массива
int k = 0;
int x;
for (int i=0;k<10;i++)
{
  x = rnd.Next(40)+10;
  if (k == 0)    //добавление 1-го элемента массива
  {
    ar[k]= x;
    k = k + 1;
  }
  else  //добавление остальных элементов массива
  {
    int m = 0;
    for (int j=0;j<k;j++)  // проверка совпадений
    {
      if (ar[j] == x) m = m + 1; // счетчик совпадений
    }
    if (m == 0) // добавление нового элемента при отсутствии совпадений
    {
      ar [k] = x;
          for (int s = 0; s <= k; s++)  // сортировка
          {
              int p = s;
              int q = ar[s];
              for (int d = s + 1; d <= k; d++)
              {
                  if (ar[d] < q) // сравнение с остальными элементами массива, поиск наименьшего
                  {
                      p = d;
                      q = ar[d];
                  }
              }
              ar[p] = ar[s];
              ar[s] = q;              
          }
      k = k + 1;        
    }
  }
}
// вывод массива
string str = ar[0].ToString();
for (int i=1;i<10;i++)
{
  str += ", " + ar[i]; 
}
label2.Text = str;
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.01.2015, 21:48
Цитата Сообщение от kirill88 Посмотреть сообщение
Заполнить массив (из 10 элементов) случайными числами от 10 до 50
От 10 до 50 — это всего 40 элементов.
Сгенерируйте их по порядку и перемешайте случайным образом.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
08.01.2015, 21:53
Цитата Сообщение от kolorotur Посмотреть сообщение
От 10 до 50 — это всего 40 элементов.
Вернее 41, если обе границы включаются
0
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,234
08.01.2015, 21:55
Цитата Сообщение от chumich Посмотреть сообщение
Вроде получилось объединить, но тогда выводить придется только один массив, потому что он уже упорядочен:
Кстати, работу проверил - работает без ошибок
0
0 / 0 / 1
Регистрация: 22.12.2014
Сообщений: 210
08.01.2015, 23:34  [ТС]
это значит по возрастанию элементы??? нужно вывести 2 массива: сначала случайные числа без повторений, а потом упорядочить его по возрастанию
0
 Аватар для chumich
2081 / 1239 / 464
Регистрация: 20.12.2014
Сообщений: 3,234
08.01.2015, 23:58
Лучший ответ Сообщение было отмечено kirill88 как решение

Решение

Цитата Сообщение от kirill88 Посмотреть сообщение
это значит по возрастанию элементы???
На вас не угодишь
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
49
50
51
52
53
int[] ar = new int[10];
Random rnd = new Random();
// заполнение массива
int k = 0;
int x;
string str1 = "";
for (int i=0;k<10;i++)
{
  x = rnd.Next(40)+10;
  if (k == 0)    //добавление 1-го элемента массива
  {
    ar[k]= x;
    str1 = ar[k].ToString();
    k = k + 1;
  }
  else  //добавление остальных элементов массива
  {
    int m = 0;
    for (int j=0;j<k;j++)  // проверка совпадений
    {
      if (ar[j] == x) m = m + 1; // счетчик совпадений
    }
    if (m == 0) // добавление нового элемента при отсутствии совпадений
    {
      ar [k] = x;
      str1 += ", " + ar[k];
          for (int s = 0; s <= k; s++)  // сортировка
          {
              int p = s;
              int q = ar[s];
              for (int d = s + 1; d <= k; d++)
              {
                  if (ar[d] < q) // сравнение с остальными элементами массива, поиск наименьшего
                  {
                      p = d;
                      q = ar[d];
                  }
              }
              ar[p] = ar[s];
              ar[s] = q;              
          }
      k = k + 1;        
    }
  }
}
// вывод массива
string str = ar[0].ToString();
for (int i=1;i<10;i++)
{
  str += ", " + ar[i]; 
}
label2.Text = str1; // здесь неупорядоченный
label3.Text = str;  // здесь упорядоченный
Всё проверено, всё работает

Добавлено через 5 минут
Кстати, сейчас в вашем рандоме число 50 не генерируется, поэтому, если оно должно присутствовать то исправьте 40 на 41:
C#
1
  x = rnd.Next(41)+10;
1
0 / 0 / 1
Регистрация: 22.12.2014
Сообщений: 210
09.01.2015, 13:57  [ТС]
Для меня то любой метод подойдет, а вот преподавателю не угодишь)))))))))))) спасибо большое, буду пробовать)))

Добавлено через 4 часа 34 минуты
спасибо большое! всё отлично работает!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2015, 13:57
Помогаю со студенческими работами здесь

Генерация случайных значений по маске
Требуется реализовать генерацию случайных значений по маске. Например A - большая буква, a - маленькая буква, D - цифра.... как то так. ...

Генерация 3 элементов Panel в случайных местах
Генерация 3х элементов Panel в случайных местах по всей форме.

Random без повторений
Здравствуйте. Столкнулся с такой проблемой: необходимо сгенерировать 100 неповторяющихся чисел от 0 до 99. Генерирую с помощью Random, но...

Выписать все перестановки без повторений
Есть к примеру таблица int m = 5; int n = Factorial(m); int Table = new int; Нужно всего то записать в нее все перестановки,...

Лямбда выражение и LINQ. Последовательность без повторений
Как сделать что бы результирующая последовательность имела не повторяющие числа ?


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru