Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго дня, уважаемые форумчане
Имею нижеследующий код
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2009, 15:25
Ответы с готовыми решениями:

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

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

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

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

16
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.08.2009, 15:33 2
Разумеется, из-за него
Ты просто при каждом вызове своей функции Selection заново инициализируешь ГСЧ. А на самом деле, инициализировать его нужно только один раз при старте программы - например, можешь сделать это первой же строкой в main(), ну или где тебе будет удобно, но - один! раз.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
23.08.2009, 23:10 3
Прочитай наконец-то https://www.cyberforum.ru/cpp-... 44753.html
0
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
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
24.08.2009, 11:17 5
Molotoff,
C++
1
while(ans[0] != 'n');
0
2 / 2 / 0
Регистрация: 29.05.2009
Сообщений: 20
24.08.2009, 11:46 6
Измени || на && и все будет ок.
0
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
24.08.2009, 11:54  [ТС] 7
точно, спасибо
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.08.2009, 20:18 8
Возьми за привычку читать warning'и компилятора. Поту как любой уважающий себя компилятор выдаст предупреждение на эту конструкцию, потому как результат логического выражения всегда равен true
C
1
while(ans[0]!='y' || ans[0]!='n')
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
26.08.2009, 20:24 9
Возьми за привычку читать warning'и компилятора.
Не - лучше включить опцию - трактовать все warnings as errors.
Тут все и выплывет
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
26.08.2009, 20:28 10
Цитата Сообщение от odip Посмотреть сообщение
Не - лучше включить опцию - трактовать все warnings as errors.
Тут все и выплывет
С такой опцией временами задалбывает. Напишешь переменную, не успеешь её заиспользовать - и warning "неиспользуемая переменная". При написании небольших программ (выдача компиляции от которых условно занимает меньше экрана) я просто включаю "все предупреждения". Но если программа большая и компилируется долго - тут уже приходится включать "предупреждения как ошибки", ибо глазами за этим уже не уследишь
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
26.08.2009, 20:33 11
Новичкам полезно такую опцию включать.
А они пишут небольшие программы.

Насчет включения всех предупреждений.
Если имеется в виду gcc, то там опция -Wall не включает все предупреждения. Все и не нужно - там довольно дурацкие есть.
Что касается Visual Studio 2005 - там есть level warnings. Достаточно включить level 3, потому что на level 4 будут совсем дурацкие предупреждения.
0
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
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 12:43 13
Цитата Сообщение от Molotoff Посмотреть сообщение
Т.е. грубо говоря из матрицы 5x3 нужно передать строки со второй по пятую например.
Нет. Либо отдельно создать указатель на строки со второй по пятой и передать его. Либо передавать в функции по строчно. (т.е. не матрицу, а строки).
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
27.08.2009, 15:36 15
Evg,
Цитата Сообщение от Molotoff Посмотреть сообщение
ну т.е. передаю указатель на массив
Он же написал
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
27.08.2009, 16:17 16
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
Evg,
Он же написал
Когда человек задаёт такой вопрос, то фраза "указатель на массив" может означать всё, что угодно
0
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
27.08.2009, 17:37  [ТС] 17
спасибо, друзья, я все понял думаю просто передать еще параметр - номер строки, с которой начинать работу с данным массивом, так будет проще всего
0
27.08.2009, 17:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2009, 17:37
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru