Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
Shef4u
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
#1

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

15.03.2013, 21:53. Просмотров 2497. Ответов 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++):

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

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

генератор псевдослучайных чисел без рандом....
народ может кто знает как сделать такой генератор без использования функций...

Перестановка без повторений
Сгенерировать перестановку N чисел без повторений. Требуется использовать...

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

Перестановки без повторений
Как из этого кода сделать конфетку — чтобы не выводились повторения? #include...

19
Ev[G]eN
iOS/Android Developer
Эксперт С++
5115 / 1553 / 950
Регистрация: 23.01.2011
Сообщений: 3,179
Завершенные тесты: 1
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 / 4
Регистрация: 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 / 4
Регистрация: 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
Эксперт С++
5115 / 1553 / 950
Регистрация: 23.01.2011
Сообщений: 3,179
Завершенные тесты: 1
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 / 4
Регистрация: 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
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
16.03.2013, 07:49 #7
Shef4u, как я понимаю, диапазон значений известен, допустимые значения известны - заполняем массив и перемешиваем std::random_shuffle.


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

Я уже раз 5 отвечал на данный вопрос, не верю, что в поиске не было результатов.
0
Ternsip
663 / 191 / 29
Регистрация: 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Эксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
29.04.2013, 16:59 #13
Ternsip,
C++
1
2
#include <cstdlib>
#include <algorithm>
1
Ternsip
663 / 191 / 29
Регистрация: 10.05.2012
Сообщений: 595
29.04.2013, 17:01 #14
MrGluck, в Microsoft Visual C++ 2012 уже не нужно
0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
29.04.2013, 17:07 #15
Ternsip, ничто не гарантирует, что данные хедеры подключатся какими-то косыми-кривыми путями. Если используете функцию из файла - укажите явно где её искать.

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

Добавлено через 1 минуту
Кстати, правила п.5.10 прочтите.
Как бы ни хотелось - но закон есть закон.
1
Shef4u
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
01.05.2013, 21:42  [ТС] #16
Цитата Сообщение от MrGluck Посмотреть сообщение
Делается все так:
берется массив, заполняется всеми возможными значениями, далее с помощью std::random_shuffle перемешивается, и, если нам нужно получить новое "неповторяющееся число" - берем следующий элемент массива, сдвигая индекс.

Я уже раз 5 отвечал на данный вопрос, не верю, что в поиске не было результатов.
спасибо, но что делать если всеможможных значений 36 и больше? не записывать же все в массив. и что вы имели ввиду под сдвигом индекса? побитовое? >>
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
01.05.2013, 21:47 #17
Цитата Сообщение от Shef4u Посмотреть сообщение
спасибо, но что делать если всеможможных значений 36 и больше?
Мелочевка.

Цитата Сообщение от Shef4u Посмотреть сообщение
и что вы имели ввиду под сдвигом индекса? побитовое? >>
Уже столько раз обсасывалось, что даже отвечать лень... У тебя есть массив array из N случайных чисел. Если нужно K чисел, то выбираешь array[i] где i = [0..K]. Если нужно очередное число, берешь i+1.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
01.05.2013, 23:10 #18
Shef4u, вы считаете, что каждый раз тыкаться по всему массиву из n чисел, проверяя есть ли данное число в массиве и если нет - повторять операцию до посинения - лучший вариант? Нет, к сожалению более производительного решения, чем я предложил нет. Да и недолго это на ЭВМ то.

Цитата Сообщение от Shef4u Посмотреть сообщение
сдвигом индекса
инкремент
1
nonedark2008
1022 / 762 / 210
Регистрация: 28.07.2012
Сообщений: 2,118
02.05.2013, 00:36 #19
По мне так генерировать последовательность неповторяющихся простых чисел оптимальнее всего было бы с использованием конгруэнтного метода, который замечательно описан во втором томе Кнута.
0
Shef4u
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
03.05.2013, 11:44  [ТС] #20
Цитата Сообщение от nonedark2008 Посмотреть сообщение
По мне так генерировать последовательность неповторяющихся простых чисел оптимальнее всего было бы с использованием конгруэнтного метода, который замечательно описан во втором томе Кнута.
спасибо. наслышан уже об этой книге от профессора который ведет теорию вероятности но все никак не дойдут руки прочесть
0
03.05.2013, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 11:44
Привет! Вот еще темы с решениями:

Перестановки без повторений
Требуется дописать исключение повторений в коде,спасибо. #include &lt;iostream&gt;...

Сочетание без повторений
Нужно вывести все возможные комбинации из 37 цифр без повторений. Тоисть...

Перебор без повторений
текст задачи во вложении мой код: #include &lt;iostream&gt; using namespace std; ...

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


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

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

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