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

Вопрос по генерации случайного числа. - C++

Восстановить пароль Регистрация
 
Slimmy
 Аватар для Slimmy
65 / 18 / 2
Регистрация: 09.10.2010
Сообщений: 97
22.10.2010, 21:51     Вопрос по генерации случайного числа. #1
Здрасьте еще раз!
На этот раз я никак не могу понять, как сделать генерацию случайных чисел (заполнение массива), которая зависит от времени. Есть код программы (приведен ниже). Программа работает со 100% производительностью Поэтому ошибки в вычислениях искать не нужно. Помогите только с генератором.
Раньше был генератор вне зависимости от времени, но он выдавал каждый запуск одни и те же числа. Мне же нужно, чтобы каждый раз были разные.
После того, как я почитал книженцию и заменил все согласно моему понимаю, то числа действительно после каждого запуска стали разными. Однако, все числа в массиве одинаковые. Возможно, предыдущие 2 предложения не совсем понятны... Скомпильте программу и сами все увидите.
Можете дать дельный совет по этому поводу?
Заранее спасибо!
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
62
63
64
65
66
67
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
/*Функция для генерации случайного числа в интервале от 1 до 100.*/
int func_random (){
    srand(time(NULL));
    return 1 + rand() % 100;
}
/*Функция для вычисления количества слагаемых и суммы до первого отрицательного элемента.*/
int func_sum(int MasSize, int* Massive){
    int i, sum_MasElement = 0;
    int num_MasElement = 0;
    for(i = MasSize - 1; i > 0; i--){
        if(Massive[i] >= 0){
            sum_MasElement += Massive[i];
            num_MasElement += 1;
        }
        else{
            break;
        }
}
    printf("\nThe sum of numbers under first minus element >> %d.", sum_MasElement);
    printf("\nThe numbers under first minus element >> %d.", num_MasElement);
return 0;
}
 
int main(){
    int MasSize; //Объявление типа размера массива и суммы.
    int* Massive; //Объявление указателя на начальный элемент массива.
    int i, tmp; //Объявление типа параметра цикла.
    printf("\tTask #5. Sum under first minus element.\n\n");
    printf("ATTENTION! Size of massive must be more then 0!\n");
/*Ввода и проверка размера массива.*/   
    do{
        printf("Input size of massive >> ");
            scanf("%d", &MasSize);
        }
    while(MasSize <= 0);
    Massive = new int [MasSize];
/*Условие на проверку инициализируемости указателя (захват памяти).*/   
    if(Massive == NULL){
        printf("Sorry, memory was not captured!");
        return 1;
    }
/*Цикл на заполнение массива.*/
    printf("\nThe filling of the array by randomize numbers...\n\n");
    for( i = 0; i < MasSize; i++){
        Massive[i] = func_random();
        tmp = func_random();
        if(tmp > 5){
            Massive[i] = -Massive[i];
        }
    }
    printf("Put result massive out:\n");
    for(i = 0; i < MasSize; i++){
        printf("%d ", Massive[i]);
    }
/*Вызов функции*/
    func_sum(MasSize, Massive);
    printf("\n\n\t\tPlease, put anykey for exit from programm...");
    getch();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
22.10.2010, 22:10     Вопрос по генерации случайного числа. #2
C++
1
srand(time(NULL));
Вставте ету строку в функцию main!!!
Slimmy
 Аватар для Slimmy
65 / 18 / 2
Регистрация: 09.10.2010
Сообщений: 97
22.10.2010, 22:20  [ТС]     Вопрос по генерации случайного числа. #3
Цитата Сообщение от MILAN Посмотреть сообщение
C++
1
srand(time(NULL));
Вставте ету строку в функцию main!!!
Вставил, сразу после инициализации переменных и перед выводом всяких мэсяг на экран. Ничего не изменилось.
C++
1
2
3
int i, tmp; //Объявление типа параметра цикла.
    srand(time(NULL));
    printf("\tTask #5. Sum under first minus element.\n\n");
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
22.10.2010, 22:25     Вопрос по генерации случайного числа. #4
А с функции убрали?
Slimmy
 Аватар для Slimmy
65 / 18 / 2
Регистрация: 09.10.2010
Сообщений: 97
22.10.2010, 22:28  [ТС]     Вопрос по генерации случайного числа. #5
Цитата Сообщение от MILAN Посмотреть сообщение
А с функции убрали?
Убрал. Ошибка не в функции была. Когда менял кое-чего задел в итоге работало как-то коряво. Моя проблема.
Спасибо Вам МИЛАН, который раз уже выручаете
ObiSan
5 / 5 / 0
Регистрация: 08.10.2010
Сообщений: 23
23.10.2010, 05:28     Вопрос по генерации случайного числа. #6
Кстати, запись
C++
1
rand() % 100;
немного не псевдослучайная, так как диапазон чисел [0; 32767], то в какую-то часть диапазона вы будете попадать чаще.
Slimmy
 Аватар для Slimmy
65 / 18 / 2
Регистрация: 09.10.2010
Сообщений: 97
23.10.2010, 09:40  [ТС]     Вопрос по генерации случайного числа. #7
Все числа генерируемые компьютером не могут быть псевдослучайными. Чисел из одного промежутка всегда будет больше, чем из другого. Но, однако, все они колеблются возле "точки равновесия" в зависимости от N в rand() % N, оно будет разным и отличаться будет не слишком на много, например для мощности алфавита из 6-ти чисел (1-6), при повторе примерно 6.000 раз, мы можем получить и такие соотношения: 978, 1012, 1000, 999, 1001, 1000. Это я ради примера показал. Так что, на мой взгляд, псевдослучайными назвать нельзя не один из способов задания
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
23.10.2010, 10:34     Вопрос по генерации случайного числа. #8
Slimmy, все ты перепутал
Числа называются псевдослучайными потому что они не случайные
Поэтому все правильно - компьютер генерирует псевдослучайные числа

Но есть физические генераторы,
которые могут генерировать действительно случайные числа
В некоторых мамочках бывают встроенные
ObiSan
5 / 5 / 0
Регистрация: 08.10.2010
Сообщений: 23
23.10.2010, 11:43     Вопрос по генерации случайного числа. #9
Slimmy, просто, можно использовать стандартный способ
C++
1
rand()/RAND_MAX*[диапазон] + фаза
В таком случае, вы сжимаете диапазон, и рандом у вас будет равномерный по всей области.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2010, 16:59     Вопрос по генерации случайного числа.
Еще ссылки по теме:

C++ Генерация случайного числа
Генерация пятизначного случайного числа C++
C++ Время генерации случайного числа

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.10.2010, 16:59     Вопрос по генерации случайного числа. #10
Вообще он и так равномерный, ибо реализует именно равномерное распределение. А всё дело в операции % - она ведь даёт последние цифры числа (грубо), а этот диапазон как раз распределён не равномерно (числа, скажем 325, 825, 1525, 5825 достаточно равномерно распределены, но две их последние цифры одни и те же). А вот когда мы делим полученное число на рандмакс и умножаем на диапазон - снова возвращаемся к равномерному распределению.
Yandex
Объявления
23.10.2010, 16:59     Вопрос по генерации случайного числа.
Ответ Создать тему
Опции темы

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