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

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

Войти
Регистрация
Восстановить пароль
 
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
#1

Проблемка с генерацией случайных чисел - C++

22.08.2009, 15:25. Просмотров 907. Ответов 16
Метки нет (Все метки)

Доброго дня, уважаемые форумчане
Имею нижеследующий код
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
38
39
40
for(int i_o = 0; i_o < init_arr[2]; i_o++) 
//for(int i_o = 0; i_o < 1; i_o++) 
{
    for(int i=0; i<n; i++) {sel_arr[i] = true;}
    f_rep = 0; s_rep = 0;
    for(int i=0; i<n; i+=2)
    {
 
 
        Selection(sel_arr, n, f_rep, s_rep, init_arr[10]);
        cout << f_rep << " " << s_rep << endl;
             }
}
 
inline void Selection(bool* arr2, unsigned int dim1, unsigned int& f_rep, unsigned int& s_rep, int param){
int i, j, q;
 
    switch(param)
    {
        
    case 1:
        srand((unsigned)time( NULL ) );
            for(i=0; i<2; i++){
                do
                {
                    q = rand()%(dim1); 
                }
                while(arr2[q]==false);
                if(i==0){
                    f_rep = q;
                    arr2[q] = false;}
                else
                {s_rep = q;
                    arr2[q] = false;
                }
                //
            }
        break;
    }
}
Столкнулся с такой проблемкой - ф-я Selection выбирает пары из массива случайным образом и выводит номера этих пар - они потом используются в дальнейшем.
Так вот эти последовательности в рамках цикла i_o повторяются с определенным интервалом. Например
2 3
1 5
0 4

2 3
1 5
0 4

2 3
1 5
0 4

5 1
3 0
2 4

5 1
3 0
2 4

5 1
3 0
2 4


Никак не могу понять в чем причина такой ситуации - может из-за srand((unsigned)time( NULL ) )?
Вообщем об это сломал себе моск, подскажите что не так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2890 / 1239 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
22.08.2009, 15:33     Проблемка с генерацией случайных чисел #2
Разумеется, из-за него
Ты просто при каждом вызове своей функции Selection заново инициализируешь ГСЧ. А на самом деле, инициализировать его нужно только один раз при старте программы - например, можешь сделать это первой же строкой в main(), ну или где тебе будет удобно, но - один! раз.
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
23.08.2009, 23:10     Проблемка с генерацией случайных чисел #3
Прочитай наконец-то http://www.cyberforum.ru/cpp-beginners/thread44753.html
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
24.08.2009, 10:51  [ТС]     Проблемка с генерацией случайных чисел #4
читал, только там не было сказано, что srand((unsigned)time( NULL ) ) нужно только один раз объявлять
теперь разобрался
по пути вопрос задам
опять же код:
C++
1
2
3
4
5
6
7
8
9
char ans[2];
 
do
{
CharToOemA("Еще раз? (y/n): ",str);
    cout << str << endl;    
             cin.getline(ans,2);
    cout << ans;
} while(ans[0]!='y' || ans[0]!='n');
не хочет работать, т.е. в цикле выводит вводимый ответ, а по введенному "y" или "n" не выходит из цикла, в чем причина?
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
24.08.2009, 11:17     Проблемка с генерацией случайных чисел #5
Molotoff,
C++
1
while(ans[0] != 'n');
Lunatik
2 / 2 / 0
Регистрация: 29.05.2009
Сообщений: 20
24.08.2009, 11:46     Проблемка с генерацией случайных чисел #6
Измени || на && и все будет ок.
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
24.08.2009, 11:54  [ТС]     Проблемка с генерацией случайных чисел #7
точно, спасибо
Evg
Эксперт CАвтор FAQ
17289 / 5537 / 345
Регистрация: 30.03.2009
Сообщений: 15,064
Записей в блоге: 26
26.08.2009, 20:18     Проблемка с генерацией случайных чисел #8
Возьми за привычку читать warning'и компилятора. Поту как любой уважающий себя компилятор выдаст предупреждение на эту конструкцию, потому как результат логического выражения всегда равен true
C
1
while(ans[0]!='y' || ans[0]!='n')
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
26.08.2009, 20:24     Проблемка с генерацией случайных чисел #9
Возьми за привычку читать warning'и компилятора.
Не - лучше включить опцию - трактовать все warnings as errors.
Тут все и выплывет
Evg
Эксперт CАвтор FAQ
17289 / 5537 / 345
Регистрация: 30.03.2009
Сообщений: 15,064
Записей в блоге: 26
26.08.2009, 20:28     Проблемка с генерацией случайных чисел #10
Цитата Сообщение от odip Посмотреть сообщение
Не - лучше включить опцию - трактовать все warnings as errors.
Тут все и выплывет
С такой опцией временами задалбывает. Напишешь переменную, не успеешь её заиспользовать - и warning "неиспользуемая переменная". При написании небольших программ (выдача компиляции от которых условно занимает меньше экрана) я просто включаю "все предупреждения". Но если программа большая и компилируется долго - тут уже приходится включать "предупреждения как ошибки", ибо глазами за этим уже не уследишь
odip
Эксперт С++
7153 / 3293 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
26.08.2009, 20:33     Проблемка с генерацией случайных чисел #11
Новичкам полезно такую опцию включать.
А они пишут небольшие программы.

Насчет включения всех предупреждений.
Если имеется в виду gcc, то там опция -Wall не включает все предупреждения. Все и не нужно - там довольно дурацкие есть.
Что касается Visual Studio 2005 - там есть level warnings. Достаточно включить level 3, потому что на level 4 будут совсем дурацкие предупреждения.
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
27.08.2009, 12:37  [ТС]     Проблемка с генерацией случайных чисел #12
а зачем нам warning`и? мы и при горящем Check engine кататься будем и на сервис не поедем ))
это ж русское авось
у меня тут вопрос небольшого характера - если я вызываю свою функцию
C++
1
inline void Gen_ind(unsigned int **arr, unsigned int dim1, unsigned int dim2, int param)
и передаю туда двумерный массив arr, ну т.е. передаю указатель на массив, могу ли я каким-то образом передать указатель на часть массива, причем не с начала? Чтобы саму функцию не переписывать.
Т.е. грубо говоря из матрицы 5x3 нужно передать строки со второй по пятую например.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 12:43     Проблемка с генерацией случайных чисел #13
Цитата Сообщение от Molotoff Посмотреть сообщение
Т.е. грубо говоря из матрицы 5x3 нужно передать строки со второй по пятую например.
Нет. Либо отдельно создать указатель на строки со второй по пятой и передать его. Либо передавать в функции по строчно. (т.е. не матрицу, а строки).
Evg
Эксперт CАвтор FAQ
17289 / 5537 / 345
Регистрация: 30.03.2009
Сообщений: 15,064
Записей в блоге: 26
27.08.2009, 15:31     Проблемка с генерацией случайных чисел #14
Molotoff, через int** в принципе нельзя передавать указатель на духмерный массив. Только через int* с дальнейшей арифметикой ручками (в этом случае можешь передавать на середину массива) либо прямо писать в параметре "int arr[3][5]", но середину массива передавать с точностью до одного измерения (в твоём понятии это "строка")

Добавлено через 1 минуту
Ещё можно вот так:

C
1
void Gen_ind(unsigned int dim1, unsigned int dim2, unsigned int arr[dim1][dim2])
но это уже Си-99 (или что-то типа того) - не все компиляторы это съедят. Но твой первоначальный вариант по своей сути неверен. Так можно передавать только массив указателей, но не двухмерный массив
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 15:36     Проблемка с генерацией случайных чисел #15
Evg,
Цитата Сообщение от Molotoff Посмотреть сообщение
ну т.е. передаю указатель на массив
Он же написал
Evg
Эксперт CАвтор FAQ
17289 / 5537 / 345
Регистрация: 30.03.2009
Сообщений: 15,064
Записей в блоге: 26
27.08.2009, 16:17     Проблемка с генерацией случайных чисел #16
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Evg,
Он же написал
Когда человек задаёт такой вопрос, то фраза "указатель на массив" может означать всё, что угодно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2009, 17:37     Проблемка с генерацией случайных чисел
Еще ссылки по теме:

C++ Генерация случайных чисел
C++ Форматирование файла целых чисел, полученных с помощью датчика случайных чисел, нахождение контрольной суммы
C++ Задача с генерацией рандомных чисел в цикле (FOR)
C++ Генерация случайных чисел
C++ Генерацией массива чисел циклом

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

Или воспользуйтесь поиском по форуму:
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
27.08.2009, 17:37  [ТС]     Проблемка с генерацией случайных чисел #17
спасибо, друзья, я все понял думаю просто передать еще параметр - номер строки, с которой начинать работу с данным массивом, так будет проще всего
Yandex
Объявления
27.08.2009, 17:37     Проблемка с генерацией случайных чисел
Ответ Создать тему
Опции темы

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