Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.89
aletelegov
0 / 0 / 0
Регистрация: 21.05.2012
Сообщений: 8
#1

Массив случайных неповторяющихся чисел - C++

13.06.2012, 13:58. Просмотров 4171. Ответов 34
Метки нет (Все метки)

Ребят работал всю ночь и сейчас голова не пашет! объясните в чем проблема
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) 
{
                                  n: int a = rand()%20+1;
   {
            for (int j=1; j<10; j++)
            {
                if (mase[j] == a)
                {
                    goto n;
                }
            }
            mase[post]=a;
            cout <<mase[post]<< endl;
                                  post++;
}
post и mase[] - глобальные перменные
и как бы я не страрался все время числа повторяются
по логике вроде все правильно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 13:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив случайных неповторяющихся чисел (C++):

Генератор случайных неповторяющихся чисел - C++
Народ помогите! Проблема следующая. Я создал массив и заполнил его числами с помощью rand от -20 до 20. Как сделать так, чтобы при выводе...

Составить функцию, которая возвращает N случайных неповторяющихся целых чисел из диапазона - C++
Помогите плизз Составить функцию, которая возвращает N случайных неповторяющихся целых чисел из диапазона . Главная...

Эксперты! Одномерный массив неповторяющихся чисел не могу понять почему криво работает - C++
Задание: Нужно вывести массив из случайных чисел. Размер массива 8. Случайные числа от 1 до 8. Числа не должны повторяться. #include...

Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел - C++
Преобразовать одномерный массив вещественных случайных чисел в массив целых чисел больших исходных на два порядка. Напечатать массивы в два...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
1)Сформировать одномерный массив целых чисел, используя датчик случайных чисел. 2)Распечатать полученный массив. 3)Перевернуть массив...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Условие такое 1.Сформировать одномерный массив целых чисел, используя датчик случайных чисел. Распечатать полученный массив. ...

34
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
13.06.2012, 17:01 #16
Aesonet, Придумал как зделать, вот
C++ (Qt)
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
#include <iostream>
#include <time.h>
 
using namespace std;
 
int main()
{
  int mass[10];
  bool flag=false;
  srand(time(0));
  
  for(int i=0;i<10;i++){mass[i]=rand()%11;}
  
  while(true){
  flag =true;
   for(int i=0;i<10;i++){
    for(int j=0;j<10;j++){
     if(mass[i]==mass[j] && i!=j){
      mass[i] = rand()%11;
      flag = false;
      }
    }
   }
   if(flag){break;}
  }
  
  for(int i=0;i<10;i++){cout<<mass[i]<<" ";}
  cout<<endl;
  system("PAUSE");  
  return 0;
}
Я молодец
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.06.2012, 17:16 #17
я бы писал сгенеренное параллельно в "рабочий" std::set, и там проверял, есть уже такое число или нет. зачем циклить?
0
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
13.06.2012, 17:42 #18
Ну я с класами неоч пока дружу ток изучаю их... Напишите пример кода с std::set.
cactus09
Наверное жара в офисе на меня так плохо действует, не додумался к такому
0
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
13.06.2012, 17:45 #19
novi4ok,
Цитата Сообщение от Aesonet Посмотреть сообщение
Ну я с класами неоч пока дружу ток изучаю их... Напишите пример кода с std::set.
Поддерживаю, тож интересно и тож с классами не дружу
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
13.06.2012, 18:34 #20
Цитата Сообщение от cactus09 Посмотреть сообщение
novi4ok,

Поддерживаю, тож интересно и тож с классами не дружу
а зачем пишешь using namespace std;, если не используешь ничего из этого namespace?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
#include <set>
 
#define ARRAY_SIZE 10
#define RANDOM_RANGE 20 // генерируем числа до 20. должно быть больше, чем длина массива.
                                     // желательно в коде где-нибудь проверить, если задается как параметр
 
...
    int mass[ARRAY_SIZE];
    srand(time(0));
    std::set<int> set;
    int index = 0;
    ::memset (mass, 0, sizeof (mass));
    while (set.size() < ARRAY_SIZE){
        int r = rand()%RANDOM_RANGE+1;
        if (set.find(r) == set.end()){
            set.insert (r);
            *(mass+index++) = r;
        }
    }
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
13.06.2012, 19:00 #21
Цитата Сообщение от Aesonet Посмотреть сообщение
Напишите пример кода с std::set.
Вот
И на будущее.

Добавлено через 4 минуты
Правда здесь, наверное, надо будет пояснить, почему std::set.

Это реализация "самосортирующегося" контейнера данных STL. Может создан быть для любого класса, у которого определён оператор сравнения <
Суть работы заключается в работе двоичного дерева поиска в общем и красно-чёрных деревьях в частности.
1
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
13.06.2012, 19:01 #22
AnyOne697, У вас ссылки на пустые страницы http://www.cyberforum.ru/redirector....UzQSUzQXNldA==
http://www.cyberforum.ru/redirector....VDMiVFRSVGMg==
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
13.06.2012, 19:05 #23
??? Фигово. Вставлял - были нормальные. Окей - всё равно вкладки не закрываю.
http://www.cplusplus.com/reference/stl/set/find/
https://www.google.ru/search?q=std::set
http://ru.wikipedia.org/wiki/красно-чёрное_дерево
http://ru.wikipedia.org/wiki/двоичное_дерево_поиска

Добавлено через 27 секунд
P.S. Проблема не моя, а форума.
1
grizlik78
Эксперт С++
1970 / 1463 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
13.06.2012, 19:20 #24
Если диапазон чисел не сильно больше необходимого количества чисел, или равен ему, то может оказаться проще выкинуть лишние и перемешать оставшиеся. Например так:
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
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
 
int main()
{
    int const RANDOM_RANGE = 20; // числа от 0 до RANDOM_RANGE-1
    int const ARRAY_SIZE = 10; // количество чисел
    srand(time(NULL));
    std::vector<int> array(RANDOM_RANGE);
 
    // формируем массив из всех чисел
    for (int i = 0; i < RANDOM_RANGE; ++i)
        array[i] = i;
 
    // случайным образом удаляем лишние
    for (int i = RANDOM_RANGE; i > ARRAY_SIZE; --i)
        std::swap(array[i-1], array[rand() % i]);
    array.resize(ARRAY_SIZE);
 
    // перемешиваем оставшиеся
    for (int i = 0; i < ARRAY_SIZE; ++i)
        std::swap(array[i], array[rand() % ARRAY_SIZE]);
 
    for (int i = 0; i < ARRAY_SIZE; ++i)
        std::cout << array[i] << ' ';
    std::cout << std::endl;
 
    return 0;
}
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
13.06.2012, 19:32 #25
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если диапазон чисел не сильно больше необходимого количества чисел, или равен ему, то может оказаться проще выкинуть лишние и перемешать оставшиеся. Например так:
На самом деле - так даже лучше. Уж всяко лучше, чем держать довольно тяжёлый контейнер std::set. По памяти тоже самое, но по времени будет выигрыш - нет "долгих" поисков.

Эх, блин. Экспер =) Почему до меня эта идея не дошла?..
0
grizlik78
Эксперт С++
1970 / 1463 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
13.06.2012, 19:38 #26
На самом деле метод можно даже упростить, если сначала перемешать, а потом удалить.
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
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
 
int main()
{
    int const RANDOM_RANGE = 20; // числа от 0 до RANDOM_RANGE-1
    int const ARRAY_SIZE = 10; // количество чисел
    srand(time(NULL));
    std::vector<int> array(RANDOM_RANGE);
 
    // формируем массив из всех чисел
    for (int i = 0; i < RANDOM_RANGE; ++i)
        array[i] = i;
 
    // перемешиваем все числа 
    for (int i = 0; i < RANDOM_RANGE; ++i)
        std::swap(array[i], array[rand() % RANDOM_RANGE]);
 
    // удаляем последние
    array.resize(ARRAY_SIZE);
 
    for (int i = 0; i < ARRAY_SIZE; ++i)
        std::cout << array[i] << ' ';
    std::cout << std::endl;
 
    return 0;
}
Добавлено через 2 минуты
И да, есть стандартный алгоритм для перемешивания std::random_shuffle, но мне с ним не хотелось
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
13.06.2012, 19:38 #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
упростить
Цитата Сообщение от grizlik78 Посмотреть сообщение
"Premature optimization is the root of all evil". D. E. Knuth
Перемещая std::vector::resize после перемешивания мы ничего толком не делаем.
Зато можем сократить немного перемешивание заменив ARRAY_SIZE на ARRAY_SIZE/2.
0
grizlik78
Эксперт С++
1970 / 1463 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
13.06.2012, 19:57 #28
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Зато можем сократить немного перемешивание заменив ARRAY_SIZE на ARRAY_SIZE/2.
Вот этого не стоит. А ресайз просто закрепляет количество действительных элементов в размере вектора. Можно, конечно и не делать.
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
13.06.2012, 20:05 #29
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вот этого не стоит.
Не знаю. Вот примерно мои мысли (относятся к первой реализации):
ARRAY_SIZE = 1: один бессмысленный swap ( имеет ли смысл n % 1? )
ARRAY_SIZE = 2: одна итерация -> 50% будет swap, 50% - нет => всё огонь; вторая явно лишняя
ARRAY_SIZE = 3: тоже самое
ARRAY_SIZE = 100500^42^146: без разницы - всё равно будет МНОГО
0
grizlik78
Эксперт С++
1970 / 1463 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
13.06.2012, 20:19 #30
Если делать ARRAY_SIZE/2 итераций, то в среднем половина элементов из второй части массива останутся на своих местах. Это чересчур много. Вырожденный случай с размером 1 не показателен. Да элемент будет бессмысленно обмениваться сам с собой. Ну так для одного элемента и алгоритм никакой не нужен Да, для двух элементов тоже достаточно было бы одной итерации, но вторая ничего не портит. А вот с большими размерами увы, половины итераций недостаточно.
0
13.06.2012, 20:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2012, 20:19
Привет! Вот еще темы с ответами:

Сформировать одномерный массив целых чисел, используя датчик случайных чисел. - C++
Сформировать одномерный массив целых чисел, используя датчик случайных чисел. Удалить 5 последних элементов массива. Добавить в...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Сформировать одномерный массив целых чисел, используя датчик случайных чисел.Распечатать полученный массив. Удалить 5 первых элементов...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
1) Сформировать одномерный массив целых чисел, используя датчик случайных чи-сел. 2) Распечатать полученный массив. 3) Удалить элементы...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Удалить элементы кратные 7. Добавить после каждого нечетного элемента массива элемент со значением 0.


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.