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

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

15.03.2013, 21:53. Просмотров 3443. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2013, 21:53
Ответы с готовыми решениями:

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

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

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

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

19
iOS/Android Developer
Эксперт С++
5130 / 1567 / 952
Регистрация: 23.01.2011
Сообщений: 3,192
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
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
Миниатюры
Рандом без повторений  
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
iOS/Android Developer
Эксперт С++
5130 / 1567 / 952
Регистрация: 23.01.2011
Сообщений: 3,192
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
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
3193 / 2006 / 342
Регистрация: 24.11.2012
Сообщений: 4,836
16.03.2013, 07:49 7
Shef4u, как я понимаю, диапазон значений известен, допустимые значения известны - заполняем массив и перемешиваем std::random_shuffle.


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

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

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

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

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

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

Цитата Сообщение от Shef4u Посмотреть сообщение
сдвигом индекса
инкремент
1
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
02.05.2013, 00:36 19
По мне так генерировать последовательность неповторяющихся простых чисел оптимальнее всего было бы с использованием конгруэнтного метода, который замечательно описан во втором томе Кнута.
0
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
03.05.2013, 11:44  [ТС] 20
Цитата Сообщение от nonedark2008 Посмотреть сообщение
По мне так генерировать последовательность неповторяющихся простых чисел оптимальнее всего было бы с использованием конгруэнтного метода, который замечательно описан во втором томе Кнута.
спасибо. наслышан уже об этой книге от профессора который ведет теорию вероятности но все никак не дойдут руки прочесть
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2013, 11:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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