Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Heidel
112 / 112 / 39
Регистрация: 11.10.2011
Сообщений: 647
#1

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

13.10.2011, 11:43. Просмотров 3150. Ответов 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;
 
}

http://www.cyberforum.ru/cpp-beginners/thread1663044.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 11:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Функция генерирует одинаковые случайные числа (C++):

Функция rand генерирует одинаковые последовательности чисел
Всем привет, возникла проблема при написании генератора паролей. Суть - этот...

Функция, которая генерирует число в диапазоне от 0 до числа, которое передается ей в качестве параметра
Написать функцию, которая генерирует одно случайное число в диапазоне от 0 до...

Функция rand() в обоих случаях выбрасывает одинаковые числа
Почему в итоге всегда функция rand() в обоих случаях выбрасывает одинаковые...

Функция генерирует одни нули для матрицы
Написал функцию, которая должна рандомно генерировать матрицу заданых размеров,...

Rand() генерирует одни и те же числа
0100010010101010100011111101010101000010 щучу :p Всем привет, не найдя на...

14
-=ЮрА=-
Заблокирован
Автор 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));
, хммм
0
Heidel
112 / 112 / 39
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 11:53  [ТС] #3
Использовали, но не там, где надо. Уже сообразили, что нужно srand(time(NULL)); перенести из функции в main.
0
CheshireCat
Эксперт С++
2907 / 1256 / 114
Регистрация: 27.05.2008
Сообщений: 3,451
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;
 
}
1
antifaton
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 7
13.10.2011, 11:54 #5
вынеси srand(time(NULL)); в тело главной функции
0
-=ЮрА=-
Заблокирован
Автор 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 минуту
Опередили...
1
Heidel
112 / 112 / 39
Регистрация: 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];
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
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, область видимости этих переменных - в пределах функции, время жизни - время выполнения функции. После выполнения функции эти переменные будут утеряны.
0
Heidel
112 / 112 / 39
Регистрация: 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;
 
}
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
13.10.2011, 13:47 #10
В функции заполнения массива убери выделение памяти.
1
Heidel
112 / 112 / 39
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 13:57  [ТС] #11
А можете объяснить, почему так получается, что

Цитата Сообщение от kazak Посмотреть сообщение
Здесь
int *Massive;
int i;
так же как и параметр х локльные переменные функции ZapolnenieMassiva, область видимости этих переменных - в пределах функции, время жизни - время выполнения функции. После выполнения функции эти переменные будут утеряны.
и это-то понятно, но почему тогда память, выделенная под динамический массив в теле функции, остается после выхода из функции?
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
13.10.2011, 14:00 #12
Выделенную память нужно освобождать ручками.
0
-=ЮрА=-
Заблокирован
Автор 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;
}
- это не совсем то относительно памяти, зато самое то относительно области видимости переменных
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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;
}
0
Heidel
112 / 112 / 39
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 14:38  [ТС] #15
Спасибо за помощь и объяснения.
0
13.10.2011, 14:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 14:38
Привет! Вот еще темы с решениями:

Рандом генерирует одни и те же числа
Столкнулся с проблемой при написании рулетки для своей игры типа казино, при...

Нужно чтобы случайные числа вставали в конец массива,а не удаляли числа
#include &lt;iostream&gt; using namespace std; void main() { setlocale(LC_ALL,...

Rand, которая генерирует как целые, так и дробные числа
Доброго времени суток, форумчане. подскажите, пожалуйста, как нужно прописать...

Как сделать цикл который генерирует числа состоящие из определенных цифр
В общем нужна помощь. Мне дали задачу: 1.программа должна запросить номер...


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

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

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