15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
|
||||||
1 | ||||||
Рандом без повторений15.03.2013, 21:53. Показов 4130. Ответов 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; } покапался еще на форуме и нашел вариант с записью в массив и потом сравнением. как тогда записать в цикле значение в массив? если просто написать
0
|
15.03.2013, 21:53 | |
Ответы с готовыми решениями:
19
Нужно сделать рандом без повторений Рандом без повтора генератор псевдослучайных чисел без рандом.... Перестановка без повторений |
Mobile Software Engineer
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
|
||||||
15.03.2013, 22:15 | 2 | |||||
так?
2
|
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
|
|
15.03.2013, 22:30 [ТС] | 3 |
спасибо, cmath не работало, по этому заменил на math.h . Да и выводит не то что мне надо
0
|
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
|
|
15.03.2013, 22:32 [ТС] | 4 |
можете написать кусок кода который будет делать каждый раз проверку, не равен ли результат какому-либо из уже полученных и, если равен, вызывать rand()%2 ещё раз b еще раз?
0
|
Mobile Software Engineer
5381 / 1585 / 956
Регистрация: 23.01.2011
Сообщений: 3,214
|
||||||
15.03.2013, 22:34 | 5 | |||||
1
|
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
|
|
15.03.2013, 22:42 [ТС] | 6 |
может вам что-нибудь известно о синтаксисе де Брейновской ф-ции?
де Брейновская функция это булева функция порождающая псевдослучацную последовательность длины 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
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
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 |
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
29.04.2013, 16:55 | 11 |
Делается все так:
берется массив, заполняется всеми возможными значениями, далее с помощью std::random_shuffle перемешивается, и, если нам нужно получить новое "неповторяющееся число" - берем следующий элемент массива, сдвигая индекс. Я уже раз 5 отвечал на данный вопрос, не верю, что в поиске не было результатов.
0
|
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
|
||||||
29.04.2013, 16:58 | 12 | |||||
MrGluck, эххх, вы меня обогнали))
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
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 |
спасибо, но что делать если всеможможных значений 36 и больше? не записывать же все в массив. и что вы имели ввиду под сдвигом индекса? побитовое? >>
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
01.05.2013, 21:47 | 17 |
Мелочевка.
Уже столько раз обсасывалось, что даже отвечать лень... У тебя есть массив array из N случайных чисел. Если нужно K чисел, то выбираешь array[i] где i = [0..K]. Если нужно очередное число, берешь i+1.
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
01.05.2013, 23:10 | 18 |
Shef4u, вы считаете, что каждый раз тыкаться по всему массиву из n чисел, проверяя есть ли данное число в массиве и если нет - повторять операцию до посинения - лучший вариант? Нет, к сожалению более производительного решения, чем я предложил нет. Да и недолго это на ЭВМ то.
инкремент
1
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
02.05.2013, 00:36 | 19 |
По мне так генерировать последовательность неповторяющихся простых чисел оптимальнее всего было бы с использованием конгруэнтного метода, который замечательно описан во втором томе Кнута.
0
|
15 / 15 / 4
Регистрация: 31.10.2011
Сообщений: 116
|
|
03.05.2013, 11:44 [ТС] | 20 |
спасибо. наслышан уже об этой книге от профессора который ведет теорию вероятности но все никак не дойдут руки прочесть
0
|
03.05.2013, 11:44 | |
03.05.2013, 11:44 | |
Помогаю со студенческими работами здесь
20
Перестановки без повторений Сочетание без повторений Перебор без повторений Перестановка без повторений Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |