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

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

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

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

22.08.2009, 15:25. Просмотров 935. Ответов 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 ) )?
Вообщем об это сломал себе моск, подскажите что не так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2009, 15:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемка с генерацией случайных чисел (C++):

Генерацией массива чисел циклом - C++
Нужно сгенерировать 10 разных значений, не равных переменной First Я не придумал ничего лучше (случайные значения записываются в массив) ...

трабл с генерацией псевдослучайных чисел - C++
вот нашел на форумепрогу : #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; int gen_random( int range_min, int...

Задача с генерацией рандомных чисел в цикле (FOR) - C++
Даны две последовательности целых чисел a1, a2, …an и b1, b2, …bn Все члены последовательностей - различные числа. Найти, сколько членов...

Запишите шесть строк, состоящих из двух случайных чисел типа int, которые не больше 10 и трех случайных чисел - C++
Запишите шесть строк, состоящих из двух случайных чисел типа int, которые не больше 10 и трех случайных чисел типа float, что не больше...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Условие такое 1.Сформировать одномерный массив целых чисел, используя датчик случайных чисел. Распечатать полученный массив. ...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Удалить элементы кратные 7. Добавить после каждого нечетного элемента массива элемент со значением 0.

16
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
22.08.2009, 15:33 #2
Разумеется, из-за него
Ты просто при каждом вызове своей функции Selection заново инициализируешь ГСЧ. А на самом деле, инициализировать его нужно только один раз при старте программы - например, можешь сделать это первой же строкой в main(), ну или где тебе будет удобно, но - один! раз.
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
23.08.2009, 23:10 #3
Прочитай наконец-то http://www.cyberforum.ru/cpp-beginners/thread44753.html
0
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" не выходит из цикла, в чем причина?
0
mirso
525 / 343 / 17
Регистрация: 05.04.2009
Сообщений: 709
24.08.2009, 11:17 #5
Molotoff,
C++
1
while(ans[0] != 'n');
0
Lunatik
2 / 2 / 0
Регистрация: 29.05.2009
Сообщений: 20
24.08.2009, 11:46 #6
Измени || на && и все будет ок.
0
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
24.08.2009, 11:54  [ТС] #7
точно, спасибо
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,206
Записей в блоге: 27
26.08.2009, 20:18 #8
Возьми за привычку читать warning'и компилятора. Поту как любой уважающий себя компилятор выдаст предупреждение на эту конструкцию, потому как результат логического выражения всегда равен true
C
1
while(ans[0]!='y' || ans[0]!='n')
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
26.08.2009, 20:24 #9
Возьми за привычку читать warning'и компилятора.
Не - лучше включить опцию - трактовать все warnings as errors.
Тут все и выплывет
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,206
Записей в блоге: 27
26.08.2009, 20:28 #10
Цитата Сообщение от odip Посмотреть сообщение
Не - лучше включить опцию - трактовать все warnings as errors.
Тут все и выплывет
С такой опцией временами задалбывает. Напишешь переменную, не успеешь её заиспользовать - и warning "неиспользуемая переменная". При написании небольших программ (выдача компиляции от которых условно занимает меньше экрана) я просто включаю "все предупреждения". Но если программа большая и компилируется долго - тут уже приходится включать "предупреждения как ошибки", ибо глазами за этим уже не уследишь
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
26.08.2009, 20:33 #11
Новичкам полезно такую опцию включать.
А они пишут небольшие программы.

Насчет включения всех предупреждений.
Если имеется в виду gcc, то там опция -Wall не включает все предупреждения. Все и не нужно - там довольно дурацкие есть.
Что касается Visual Studio 2005 - там есть level warnings. Достаточно включить level 3, потому что на level 4 будут совсем дурацкие предупреждения.
0
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 нужно передать строки со второй по пятую например.
0
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 12:43 #13
Цитата Сообщение от Molotoff Посмотреть сообщение
Т.е. грубо говоря из матрицы 5x3 нужно передать строки со второй по пятую например.
Нет. Либо отдельно создать указатель на строки со второй по пятой и передать его. Либо передавать в функции по строчно. (т.е. не матрицу, а строки).
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,206
Записей в блоге: 27
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 (или что-то типа того) - не все компиляторы это съедят. Но твой первоначальный вариант по своей сути неверен. Так можно передавать только массив указателей, но не двухмерный массив
0
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 15:36 #15
Evg,
Цитата Сообщение от Molotoff Посмотреть сообщение
ну т.е. передаю указатель на массив
Он же написал
0
27.08.2009, 15:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2009, 15:36
Привет! Вот еще темы с ответами:

Записать в файл f N целых чисел, полученных с помощью генератора случайных чисел. - C++
Помогите пожалуйста с задачей. Записать в файл f N целых чисел, полученных с помощью генератора случайных чисел. Заполнить файл g...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
Сформировать одномерный массив целых чисел, используя датчик случайных чисел.Распечатать полученный массив. Удалить 5 первых элементов...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел. - C++
Сформировать одномерный массив целых чисел, используя датчик случайных чисел. Удалить 5 последних элементов массива. Добавить в...

Сформировать одномерный массив целых чисел, используя датчик случайных чисел - C++
1)Сформировать одномерный массив целых чисел, используя датчик случайных чисел. 2)Распечатать полученный массив. 3)Перевернуть массив...


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

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

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