Форум программистов, компьютерный форум CyberForum.ru

Массив из рандомов - C++

Восстановить пароль Регистрация
 
id3dx9
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 6
06.09.2012, 09:46     Массив из рандомов #1
Существует массив, его нужно заполнить рандомными цифрами от 1 до 36, так, чтобы цифры не повторялись: сам дошел до вот такого:

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
#include "iostream"
#include "cstdio"
#include "cstdlib"
 
using namespace std;
 
int main()
{
    int nCards[36];
    int nBuffer;
    for(int i=0;i<36;i++)
    {
          
            nBuffer = rand() % 36;
            cout << nBuffer << endl;
            
            for(int a=0;a<36;a++)
        {
            if (nBuffer != nCards[a])
            {
                nCards[i] = nBuffer;
                break;
            }
        }
 
    }
        
        for(int k = 0; k<36; k++)
        {
            cout << nCards[k] << ", ";
        }
                
         
         system ("PAUSE");
         return 0;
}
проблема в том, что числа внутри массива повторяются, то есть
C++
1
2
3
4
5
6
7
8
for(int a=0;a<36;a++)
        {
            if (nBuffer != nCards[a])
            {
                nCards[i] = nBuffer;
                break;
            }
        }
задуманное изначально как проверка на наличие такого числа в массиве, не работает.

подтолкните в правильном направлении
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 09:46     Массив из рандомов
Посмотрите здесь:

C++ с клавиатуры ввести массив,во второй массив записать нечетные элементы из первого
Дан массив А(4,4). Сформировать массив В(4) из среднеарифметических значений элементов в каждой строке. C++
Массив: Составить массив из двух исходных по заданному принципу заполнения C++
C++ Массив: сформировать массив C[12] так, чтобы элементы располагались следующим образом: A(1) B(1) A(2) B(2)
Переписать положительные элементы массива K,кратные пяти в массив M,а остальные-в массив Q. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
06.09.2012, 09:54     Массив из рандомов #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main()
{
   int nCards[36];
   for(int i = 0; i < 36; i++) 
      nCards[i] = i + 1;
   std::random_shuffle(std::begin(nCards), std::end(nCards));  
   std::copy(std::begin(nCards), std::end(nCards), std::ostream_iterator<int>(std::cout, " "));
}
link
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
06.09.2012, 10:05     Массив из рандомов #3
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
#include "iostream"
#include "cstdio"
#include "cstdlib"
 
using namespace std;
 
int main()
{
    int nCards[36];
    int nBuffer;
    int i = 0;
    while (i < 36)    
    {
          
            nBuffer = rand() % 36;
            cout << nBuffer << endl;
            
            bool exists = false;
            for(int a=0;a<36 && !exists;a++)
                 exists = (nBuffer == nCards[a]) ? 1 : 0;
          
            if (exists == false)
            {
                nCards[i] = nBuffer;
                i++;            
            }
     }
        
        for(int k = 0; k<36; k++)
        {
            cout << nCards[k] << ", ";
        }
                
         
         system ("PAUSE");
         return 0;
}
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
06.09.2012, 10:08     Массив из рандомов #4
zitxbit, я даже боюсь представить сколько итераций будет у вас сделано
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
06.09.2012, 10:10     Массив из рандомов #5
Цитата Сообщение от id3dx9 Посмотреть сообщение
Существует массив, его нужно заполнить рандомными цифрами от 1 до 36
при помощи вспомогательного массива
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool arrBool[36];
int arrInt[36];
int tmp;
for(int i=0;i<36;i++)
   arrBool[i]=false;
 
for(int i=0;i<36;i++)
{
    tmp= rand() % 36;
    
    while(arrBool[tmp])
           tmp= rand() % 36;
 
   arrBool[tmp]=true;
   arrInt[i]=tmp;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.09.2012, 10:22     Массив из рандомов #6
Вспомогательный массив не нужен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstdlib>
#include <ctime>
 
const int N = 36;
 
int main()
{
  srand(time(NULL));
 
  int array[N];
  for (int i = 0; i < N; ++i) {
    array[i] = i + 1;
  }
  
  for (int i = N; i > 0; --i) {
    std::swap(array[i - 1], array[rand() % i]);
  }
  
  for (int i = 0; i < N; ++i) {
    std::cout << array[i] << " ";
  }
}
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 10:30     Массив из рандомов #7
Цитата Сообщение от Пaтрик Посмотреть сообщение
..
Я бы сказал STL-way даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <algorithm>
#include <iterator>
 
struct c_unique {
  int current;
  c_unique() {current=0;}
  int operator()() {return ++current;}
};
 
int main()
{
   int nCards[36];
   c_unique UniqueNumber;
   std::generate(std::begin(nCards), std::end(nCards), UniqueNumber);
   std::random_shuffle(std::begin(nCards), std::end(nCards));  
   std::copy(std::begin(nCards), std::end(nCards), std::ostream_iterator<int>(std::cout, " "));
}
OhMyGodSoLong
06.09.2012, 10:39
  #8

Не по теме:

std::generate(std::begin(nCards), std::end(nCards), [](int &&n){ return [&](){ return ++n; }; }(0));
^^

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.09.2012, 10:40     Массив из рандомов #9
Move это конечно круто, но с примитивными типами - бессмысленно. Логичнее лямбду тогда mutable сделать.
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
06.09.2012, 10:42     Массив из рандомов #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
 
#include <boost/numeric/ublas/storage.hpp>
 
int main()
{
    using namespace boost::numeric::ublas;
    range rng(1, 37);
    std::vector<int> vec(rng.begin(), rng.end());
    std::random_shuffle(vec.begin(), vec.end());
    std::copy(vec.begin(), vec.end(),
        std::ostream_iterator<int>(std::cout, " "));
}
link
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.09.2012, 10:43     Массив из рандомов #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Move это конечно круто, но с примитивными типами - бессмысленно. Логичнее лямбду тогда mutable сделать.
Я просто не знаю знал, как там это делать
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.09.2012, 10:51     Массив из рандомов #12
~OhMyGodSoLong~, Че-нибудь типа

C++
1
2
3
4
   std::generate(std::begin(array), std::end(array), [](int p) mutable
   {
      return [p]() mutable { return ++p; };
   }(0));
http://liveworkspace.org/code/2a23b3...3237308f30a489
Хотя я сравнил эти два подхода и с move мне нравится больше пожалуй
id3dx9
0 / 0 / 0
Регистрация: 31.08.2012
Сообщений: 6
06.09.2012, 22:15  [ТС]     Массив из рандомов #13
Народ, спасибо всем)
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
06.09.2012, 22:24     Массив из рандомов #14
Цитата Сообщение от id3dx9 Посмотреть сообщение
Народ, спасибо всем)
для спасибы кнопка есть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2014, 09:39     Массив из рандомов
Еще ссылки по теме:

C++ Массив: Переместить в массив Y все числа, дробная часть которых больше 5.
C++ Дан массив. Записать во второй массив все элементы, не совпадающие с минимальным
Сжать массив, выбросив из него отрицательные элементы - массив становится пустым C++

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

Или воспользуйтесь поиском по форуму:
MegaMux
Сообщений: n/a
08.05.2014, 09:39     Массив из рандомов #15
Достаточно эффективно!
Yandex
Объявления
08.05.2014, 09:39     Массив из рандомов
Ответ Создать тему
Опции темы

Текущее время: 18:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru