С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Функция заполнения генерирует одинаковые случайные числа - C++
Помогите, пожалуйста, разобраться. Я написал функцию заполнения массива и вызываю ее при для заполнения значениями элементов двух разных...

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

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

Функция rand() в обоих случаях выбрасывает одинаковые числа - C++
Почему в итоге всегда функция rand() в обоих случаях выбрасывает одинаковые числа, а выбрасывать начинает всегда с 6 . 6, потом идёт 5 . 5,...

Функция генерирует одни нули для матрицы - C++
Написал функцию, которая должна рандомно генерировать матрицу заданых размеров, но она выдает одни нули: double **CreateMatrix() { ...

Rand() генерирует одни и те же числа - C++
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
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 11:53  [ТС] #3
Использовали, но не там, где надо. Уже сообразили, что нужно srand(time(NULL)); перенести из функции в main.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
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
111 / 111 / 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];
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 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
111 / 111 / 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;
 
}
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
13.10.2011, 13:47 #10
В функции заполнения массива убери выделение памяти.
1
Heidel
111 / 111 / 7
Регистрация: 11.10.2011
Сообщений: 647
13.10.2011, 13:57  [ТС] #11
А можете объяснить, почему так получается, что

Цитата Сообщение от kazak Посмотреть сообщение
Здесь
int *Massive;
int i;
так же как и параметр х локльные переменные функции ZapolnenieMassiva, область видимости этих переменных - в пределах функции, время жизни - время выполнения функции. После выполнения функции эти переменные будут утеряны.
и это-то понятно, но почему тогда память, выделенная под динамический массив в теле функции, остается после выхода из функции?
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 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
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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
111 / 111 / 7
Регистрация: 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
Привет! Вот еще темы с ответами:

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

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

Rand, которая генерирует как целые, так и дробные числа - C++
Доброго времени суток, форумчане. подскажите, пожалуйста, как нужно прописать функцию rand(), чтобы я получил и целые, и дробные элементы....

Случайные числа в C++ - C++
нужно присвоить переменной числа от -50 до 50, как сделать?


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

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

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