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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Shef4u
15 / 15 / 0
Регистрация: 31.10.2011
Сообщений: 116
#1

Рандом без повторений - C++

15.03.2013, 21:53. Просмотров 2266. Ответов 19
Метки нет (Все метки)

Здравствуйте! Искал по форуме, но так и не нашел подходящее решение такой задачи:
пользователь вводит К ПРИМЕРУ число 7. я беру от него логарифм за основанием 2 и заокругляю к большему n=ceil(log(Np)/log(2)); это выйдет n=3. ага, теперь я знаю, что мне надо 7 комбинаций по 3 символа в двочином коде не считая 000 так как всего может быть восемь: 000 111 100 101 011 001 110 010. 000 мне не надо. внимание вопрос: как это сделать через rand или как-то иначе?? вот мой код, но в нем числа повторяютя и комбинация 000 присутствует((
Код
int Np;
float n;
cout<<"Введите Np="; cin>>Np;
n=ceil(log(Np)/log(2));
cout<<"n="<<n<<endl;
randomize();
for (int i=0; i<Np; i++)
{
  for (int j=0; j<n; j++)
cout<<rand()%2;
cout<<endl;      
}
Добавлено через 3 часа 7 минут
покапался еще на форуме и нашел вариант с записью в массив и потом сравнением. как тогда записать в цикле значение в массив? если просто написать
C++
1
2
3
4
5
6
7
8
9
10
11
12
int Np, *mas=new int[Np];
float n;
cout<<"Введите Np="; cin>>Np;
n=ceil(log(Np)/log(2));
cout<<"n="<<n<<endl;
randomize();
for (int i=0; i<Np; i++)
{
  for (int j=0; j<n; j++)
cout<<rand()%2; cin>>mas[i];
cout<<endl;      
}
не подходит ((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 21:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рандом без повторений (C++):

Нужно сделать рандом без повторений - C++
Я хочу написать карточную игру Дурак. Во мне и нужно чтоб 2-ое игроков получули разн*е карт*. Как осуществить ето с помощю рандома ?

Рандом без повтора - C++
Как можно сделать в этой программе проверку, чтобы цифры не повторялись. Без матриц и строк. Пользуясь одномерным массивом. #include...

генератор псевдослучайных чисел без рандом.... - C++
народ может кто знает как сделать такой генератор без использования функций rand,srand,URandom,randomize.....

Перестановки без повторений - C++
Требуется дописать исключение повторений в коде,спасибо. #include &lt;iostream&gt; using namespace std; const int N =11; int n,a,p; ...

Перебор без повторений - C++
текст задачи во вложении мой код: #include &lt;iostream&gt; using namespace std; int f(int v) { if (v == 0) return 1; ...

Перестановка без повторений - C++
Сгенерировать перестановку N чисел без повторений. Требуется использовать циклы. Функции пока не прошли.

19
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
15.03.2013, 22:15 #2
так?
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 <algorithm>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
int main ()
{
    srand(time(0));
 
    int Np;
    std::cout << "Input Np: ";
    std::cin >> Np;
 
    int n = ceil(log(Np) / log(2));
    std::cout << "N: " << n << std::endl;
 
    int fLimit = pow(10, n - 1) - 1;
    int sLimit = pow(10, n);
    int *array = new int [Np];
    for (int i = 0; i < Np; i++) {
        int genElem = (rand() % (sLimit - fLimit + 1));
        if (!std::count(array, array + Np, genElem))
            array[i] = genElem;
        else
            i--;
    }
 
    std::cout << "Your array: " << std::endl;
    for (int i = 0; i < Np; i++)
        std::cout << array[i] << " ";
    std::cout << std::endl;
 
    delete [] array;
    return 0;
}
2
Shef4u
15 / 15 / 0
Регистрация: 31.10.2011
Сообщений: 116
15.03.2013, 22:30  [ТС] #3
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
так?
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 <algorithm>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
int main ()
{
    srand(time(0));
 
    int Np;
    std::cout << "Input Np: ";
    std::cin >> Np;
 
    int n = ceil(log(Np) / log(2));
    std::cout << "N: " << n << std::endl;
 
    int fLimit = pow(10, n - 1) - 1;
    int sLimit = pow(10, n);
    int *array = new int [Np];
    for (int i = 0; i < Np; i++) {
        int genElem = (rand() % (sLimit - fLimit + 1));
        if (!std::count(array, array + Np, genElem))
            array[i] = genElem;
        else
            i--;
    }
 
    std::cout << "Your array: " << std::endl;
    for (int i = 0; i < Np; i++)
        std::cout << array[i] << " ";
    std::cout << std::endl;
 
    delete [] array;
    return 0;
}
спасибо, cmath не работало, по этому заменил на math.h . Да и выводит не то что мне надо
0
Миниатюры
Рандом без повторений  
Shef4u
15 / 15 / 0
Регистрация: 31.10.2011
Сообщений: 116
15.03.2013, 22:32  [ТС] #4
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
так?
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 <algorithm>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
int main ()
{
    srand(time(0));
 
    int Np;
    std::cout << "Input Np: ";
    std::cin >> Np;
 
    int n = ceil(log(Np) / log(2));
    std::cout << "N: " << n << std::endl;
 
    int fLimit = pow(10, n - 1) - 1;
    int sLimit = pow(10, n);
    int *array = new int [Np];
    for (int i = 0; i < Np; i++) {
        int genElem = (rand() % (sLimit - fLimit + 1));
        if (!std::count(array, array + Np, genElem))
            array[i] = genElem;
        else
            i--;
    }
 
    std::cout << "Your array: " << std::endl;
    for (int i = 0; i < Np; i++)
        std::cout << array[i] << " ";
    std::cout << std::endl;
 
    delete [] array;
    return 0;
}
можете написать кусок кода который будет делать каждый раз проверку, не равен ли результат какому-либо из уже полученных и, если равен, вызывать rand()%2 ещё раз b еще раз?
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
15.03.2013, 22:34 #5
Цитата Сообщение от Shef4u Посмотреть сообщение
кусок кода который будет делать каждый раз проверку, не равен ли результат какому-либо из уже полученных
C++
1
2
3
4
5
6
7
for (int i = 0; i < Np; i++) {
        int genElem = (rand() % (sLimit - fLimit + 1));
        if (!std::count(array, array + Np, genElem))
            array[i] = genElem;
        else
            i--;
    }
1
Shef4u
15 / 15 / 0
Регистрация: 31.10.2011
Сообщений: 116
15.03.2013, 22:42  [ТС] #6
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
C++
1
2
3
4
5
6
7
for (int i = 0; i < Np; i++) {
        int genElem = (rand() % (sLimit - fLimit + 1));
        if (!std::count(array, array + Np, genElem))
            array[i] = genElem;
        else
            i--;
    }
может вам что-нибудь известно о синтаксисе де Брейновской ф-ции?
де Брейновская функция это булева функция порождающая псевдослучацную последовательность длины 2^n.
Важное свойство: Все числа в этой последовательности различны и находятся в диапазоне от 0 до 2^n.
де Брейновская функция для n = 3:
|x2|x1|x0|f|
| 0| 0| 0|1|
| 0| 0| 1|0|
| 0| 1| 0|1|
| 0| 1| 1|1|
| 1| 0| 0|0|
| 1| 0| 1|1|
| 1| 1| 0|0|
| 1| 1| 1|0|
0
0x10
2475 / 1648 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
16.03.2013, 07:49 #7
Shef4u, как я понимаю, диапазон значений известен, допустимые значения известны - заполняем массив и перемешиваем std::random_shuffle.


Ev[G]eN, ну вот не надо такой "угадайки". Будем кидать рандом до посинения пока не найдем неиспользованное число? И сколько раз оно сработает в ситуации, когда нужно получить случайную последовательность размером 100 со значениями в диапазоне от 0 до 99, когда остался незаполненным один последний элемент?
0
Vaste
1 / 1 / 0
Регистрация: 23.04.2012
Сообщений: 42
16.03.2013, 08:16 #8
Кидай сгенерированные значения в массив, чтоб смореть было или нет. Иначе никак.
0
olea
5 / 5 / 1
Регистрация: 30.01.2012
Сообщений: 153
28.04.2013, 13:07 #9
Shef4u, а не могли бы вы привести синтаксис де Брейновской функции?
0
Shef4u
15 / 15 / 0
Регистрация: 31.10.2011
Сообщений: 116
29.04.2013, 16:52  [ТС] #10
Цитата Сообщение от olea Посмотреть сообщение
Shef4u, а не могли бы вы привести синтаксис де Брейновской функции?
если б я его знал
0
MrGluck
Модератор
Эксперт CЭксперт С++
7424 / 4539 / 673
Регистрация: 29.11.2010
Сообщений: 12,319
29.04.2013, 16:55 #11
Делается все так:
берется массив, заполняется всеми возможными значениями, далее с помощью std::random_shuffle перемешивается, и, если нам нужно получить новое "неповторяющееся число" - берем следующий элемент массива, сдвигая индекс.

Я уже раз 5 отвечал на данный вопрос, не верю, что в поиске не было результатов.
0
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 16:58 #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <ctime>  
 
using namespace std;
 
int main(){            
    std::srand ( unsigned ( std::time(0) ) );
    vector <int> a;
    int n = 100;
    for (int i = 0; i < n; i++) {
        a.push_back(i);
    }
    std::random_shuffle(a.begin(), a.end());
    for (int i = 0; i < a.size(); i++) {
        printf("%d ", a[i]);
    }
    return 0;
}
Добавлено через 16 секунд
MrGluck, эххх, вы меня обогнали))
0
MrGluck
Модератор
Эксперт CЭксперт С++
7424 / 4539 / 673
Регистрация: 29.11.2010
Сообщений: 12,319
29.04.2013, 16:59 #13
Ternsip,
C++
1
2
#include <cstdlib>
#include <algorithm>
1
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 17:01 #14
MrGluck, в Microsoft Visual C++ 2012 уже не нужно
0
MrGluck
Модератор
Эксперт CЭксперт С++
7424 / 4539 / 673
Регистрация: 29.11.2010
Сообщений: 12,319
29.04.2013, 17:07 #15
Ternsip, ничто не гарантирует, что данные хедеры подключатся какими-то косыми-кривыми путями. Если используете функцию из файла - укажите явно где её искать.

Если что, mingw не пропустит random_shuffle, а gcc еще и на srand ругнется.

Добавлено через 1 минуту
Кстати, правила п.5.10 прочтите.
Как бы ни хотелось - но закон есть закон.
1
29.04.2013, 17:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2013, 17:07
Привет! Вот еще темы с ответами:

Перестановки без повторений - C++
Как из этого кода сделать конфетку — чтобы не выводились повторения? #include &lt;iostream&gt; using namespace std; string s; ...

Перестановка без повторений - C++
Всем привет! У меня возникла небольшая проблема при написании программы, буду благодарна за любую помощь. Задание гласит следующее:...

Последовательность чисел без повторений - C++
Здравствуйте. Мне нужно сформировать последовательности,состоящие из нулей и единиц.Последовательности не должны повторяться. Подскажите...

Random, значения без повторений - C++
Нашел здесь на форуме код для рандома без повторений: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale&gt; #include...


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

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

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