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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
#1

Функция генерирует одинаковые случайные числа - C++

13.10.2011, 11:43. Просмотров 2401. Ответов 14
Метки нет (Все метки)

Необходимо заполнить три массива произвольного размера случайными числами. Для заполнения массивов написана функция, но при отработке совпадающие по порядковому номеру элементы всех трех массивов заполняются одинаковыми значениями. Как это исправить?

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
 
int ZapolnenieMassiva (int x)
{
int *Massive;
int i;
 
srand(time(NULL));
    
cout << "Massiv iz " << x <<" elementov\t";
 
Massive = new int [x];
 
    for (i=0; i<=x-1; i++)
    {
        *(Massive+i)=rand()%100;
        cout << *(Massive+i) << " " ;
    }
    cout <<"\n" ;
    return 0;
}
 
 
int main ( )
{
    int *nMassive, *mMassive, *lMassive;
    int i, j, k;
 
    cout << "Vvedite chislo elementov n massiva=";
    cin>> i;
 
    cout << "Vvedite chislo elementov m massiva=";
    cin>> j;
 
    cout << "Vvedite chislo elementov l massiva=";
    cin>> k;
 
    cout <<"\n" ;
 
    nMassive = new int [i];
    mMassive = new int [j];
    lMassive = new int [k];
 
    nMassive[i] = ZapolnenieMassiva (i);
    mMassive[j] = ZapolnenieMassiva (j);
    lMassive[k] = ZapolnenieMassiva (k);
 
    cout <<"\n" ;
    
    return 0;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 11:43     Функция генерирует одинаковые случайные числа
Посмотрите здесь:

Случайные числа C++
Функция генерирует одни нули для матрицы C++
C++ Случайные числа.
C++ Функция, которая генерирует число в диапазоне от 0 до числа, которое передается ей в качестве параметра
Функция rand() в обоих случаях выбрасывает одинаковые числа C++
Rand, которая генерирует как целые, так и дробные числа C++
C++ Случайные числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:53     Функция генерирует одинаковые случайные числа #2
Heidel, твоя проблемма потому что не использовал srand(time(NULL)) запиши так
C++
1
2
3
4
5
int main ( )
{
        int *nMassive, *mMassive, *lMassive;
        int i, j, k;
       srand(time(NULL));
Добавлено через 2 минуты
Ха увидел
Цитата Сообщение от Heidel Посмотреть сообщение
srand(time(NULL));
, хммм
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 11:53  [ТС]     Функция генерирует одинаковые случайные числа #3
Использовали, но не там, где надо. Уже сообразили, что нужно srand(time(NULL)); перенести из функции в main.
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
13.10.2011, 11:54     Функция генерирует одинаковые случайные числа #4
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
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
 
int ZapolnenieMassiva (int* _mass, int _size)
{
int i;
 
cout << "Massiv iz " << _size <<" elementov\t";
 
        for (i=0; i<_size; i++)
        {
                _mass[i]=rand()%100;
                cout << _mass[i] << " " ;
        }
        cout <<"\n" ;
        return 0;
}
 
 
int main ( )
{
        srand(time(NULL));
 
        int *nMassive, *mMassive, *lMassive;
        int i, j, k;
 
        cout << "Vvedite chislo elementov n massiva=";
        cin>> i;
 
        cout << "Vvedite chislo elementov m massiva=";
        cin>> j;
 
        cout << "Vvedite chislo elementov l massiva=";
        cin>> k;
 
        cout <<"\n" ;
 
        nMassive = new int [i];
        mMassive = new int [j];
        lMassive = new int [k];
 
        ZapolnenieMassiva (nMassive, i);
        ZapolnenieMassiva (mMassive, j);
        ZapolnenieMassiva (lMassive, k);
 
        cout <<"\n" ;
 
        return 0;
 
}
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
13.10.2011, 11:54     Функция генерирует одинаковые случайные числа #5
вынеси srand(time(NULL)); в тело главной функции
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:59     Функция генерирует одинаковые случайные числа #6
Всё понял, проблемма в этом

Цитата Сообщение от Heidel Посмотреть сообщение
cout << "Massiv iz " << x <<" elementov\t";
Massive = new int [x];
for (i=0; i<=x-1; i++)
* * * * {
- выделение памяти под динамический массив в теле функции, а ведь при выходе его не станет, построй свою функцию заполнения след образом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int ZapolnenieMassiva (int *Massive, int x)
{
int i;
srand(time(NULL));       
cout << "Massiv iz " << x <<" elementov\t";
         for (i=0; i<=x-1; i++)
        {
                Massive[i]=rand()%100;
                cout << Massive[i] << " " ;
        }
        cout <<"\n" ;
        return 0;
}
Добавлено через 1 минуту
Опередили...
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 13:19  [ТС]     Функция генерирует одинаковые случайные числа #7
Объясните, пожалуйста, почему получается, что
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
выделение памяти под динамический массив в теле функции, а ведь при выходе его не станет
если в main задано
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main ( )
{
        int *nMassive, *mMassive, *lMassive;
        int i, j, k;
 
        cout << "Vvedite chislo elementov n massiva=";
        cin>> i;
 
        cout << "Vvedite chislo elementov m massiva=";
        cin>> j;
 
        cout << "Vvedite chislo elementov l massiva=";
        cin>> k;
 
        cout <<"\n" ;
 
        nMassive = new int [i];
        mMassive = new int [j];
        lMassive = new int [k];
kazak
 Аватар для kazak
3030 / 2351 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.10.2011, 13:40     Функция генерирует одинаковые случайные числа #8
Цитата Сообщение от Heidel Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int ZapolnenieMassiva (int x)
{
int *Massive;
int i;
 
srand(time(NULL));
        
cout << "Massiv iz " << x <<" elementov\t";
 
Massive = new int [x];
 
        for (i=0; i<=x-1; i++)
        {
                *(Massive+i)=rand()%100;
                cout << *(Massive+i) << " " ;
        }
        cout <<"\n" ;
        return 0;
}
Здесь
int *Massive;
int i;
так же как и параметр х локльные переменные функции ZapolnenieMassiva, область видимости этих переменных - в пределах функции, время жизни - время выполнения функции. После выполнения функции эти переменные будут утеряны.
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 13:44  [ТС]     Функция генерирует одинаковые случайные числа #9
Программа переписана таким образом, добавлена проверочная функция Вывод массива, но она не работает, вернее, выдает несколько больших случайных чисел в количестве заданных элементов массива, после нескольких запусков программы числа эти становятся одинаковыми. Что не так?

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
 
int ZapolnenieMassiva (int *Massive, int SizeOfMassive)
{
 
int i;
 
cout << "Massiv iz " << SizeOfMassive <<" elementov\t";
 
Massive = new int [SizeOfMassive];
 
    for (i=0; i<SizeOfMassive; i++)
    {
        *(Massive+i)=rand()%100;
        cout << *(Massive+i) << " " ;
    }
    cout <<"\n" ;
    return 0;
}
 
int VyvodMassiva (int *Massive, int SizeOfMassive)
{
    for (int i=0; i<SizeOfMassive; i++) cout << *(Massive+i) << " " ;
    return 0;
}
 
 
int main ( )
{
    int *nMassive, *mMassive, *lMassive;
    int i, j, k;
 
    cout << "Vvedite chislo elementov n massiva i=";
    cin>> i;
 
    cout << "Vvedite chislo elementov m massiva j=";
    cin>> j;
 
    cout << "Vvedite chislo elementov l massiva k=";
    cin>> k;
 
    cout <<"\n" ;
 
    nMassive = new int [i];
    mMassive = new int [j];
    lMassive = new int [k];
 
    ZapolnenieMassiva (nMassive, i);
    ZapolnenieMassiva (mMassive, j);
    ZapolnenieMassiva (lMassive, k);
 
    cout <<"\n" ;
 
    VyvodMassiva (nMassive, i);
    
    return 0;
 
}
kazak
 Аватар для kazak
3030 / 2351 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.10.2011, 13:47     Функция генерирует одинаковые случайные числа #10
В функции заполнения массива убери выделение памяти.
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 13:57  [ТС]     Функция генерирует одинаковые случайные числа #11
А можете объяснить, почему так получается, что

Цитата Сообщение от kazak Посмотреть сообщение
Здесь
int *Massive;
int i;
так же как и параметр х локльные переменные функции ZapolnenieMassiva, область видимости этих переменных - в пределах функции, время жизни - время выполнения функции. После выполнения функции эти переменные будут утеряны.
и это-то понятно, но почему тогда память, выделенная под динамический массив в теле функции, остается после выхода из функции?
kazak
 Аватар для kazak
3030 / 2351 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.10.2011, 14:00     Функция генерирует одинаковые случайные числа #12
Выделенную память нужно освобождать ручками.
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 14:01     Функция генерирует одинаковые случайные числа #13
Цитата Сообщение от Heidel Посмотреть сообщение
Объясните, пожалуйста, почему получается, что
- соглашусь с постом 8

Цитата Сообщение от Heidel Посмотреть сообщение
int *nMassive, *mMassive, *lMassive;
- это переменные main
Цитата Сообщение от Heidel Посмотреть сообщение
Massive = new int [x]; //это внутренняя переменная
for (i=0; i<=x-1; i++)
* * * * {
* * * * * * * * *(Massive+i)=rand()%100;
* * * * * * * * cout << *(Massive+i) << " " ;
* * * * }
* * * * cout <<"\n" ;
* * * * return 0;
}
- и при таком построении тела функции не имеют к ней ни малейшего отношения, для очевидности приведу пример

C++
1
2
3
4
5
6
7
8
9
10
11
12
char fun()
{
     char a = 'b';
     return a;
}
 
int main()
{
     int a = 5;
     a = fun();
     return 0;
}
- это не совсем то относительно памяти, зато самое то относительно области видимости переменных
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
13.10.2011, 14:03     Функция генерирует одинаковые случайные числа #14
На всякий случай, для увеличения тык скыть знаний:
Весь прикол в том, что если ты в коде напишешь
srand (time(0));

Запустишь процесс- закроешь, запустишь- закроешь, то в разных процессах srand-ом может генерироваться одно и то же число!

Это имей ввиду
/////////////////////////////////////////////////////////////////////////
Тоже одинаковые числа генерит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main () {
 if (1) {
  srand (time(0));
  rand();
  printf ("%d\n  ",  rand ());
 }
 if (1) {
  srand (time(0));
  rand();
  printf ("%d\n  ",  rand ());
 }
 getchar ();
 return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 14:38     Функция генерирует одинаковые случайные числа
Еще ссылки по теме:

C++ Rand() генерирует одни и те же числа
C++ Функция заполнения генерирует одинаковые случайные числа
C++ Рандом генерирует одни и те же числа
C++ Функция rand генерирует одинаковые последовательности чисел
C++ Нужно чтобы случайные числа вставали в конец массива,а не удаляли числа

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

Или воспользуйтесь поиском по форуму:
Heidel
 Аватар для Heidel
110 / 110 / 7
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 14:38  [ТС]     Функция генерирует одинаковые случайные числа #15
Спасибо за помощь и объяснения.
Yandex
Объявления
13.10.2011, 14:38     Функция генерирует одинаковые случайные числа
Ответ Создать тему
Опции темы

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