Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2017, 09:51   #1
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию генератор случайных чисел

Хочу разобраться в генераторе случайных чисел на Си. Как я понял для этого используются srand и rand, но, к сожалению, я не до конца понял как они работают: если с rand впринципе все понятно, то вот с srand не оч.
Читал, что srand надо записывать так:
Цитата:
srand (time(null));
чтобы значения были все разные, но компилятор при этом выдает предупреждение, мол невозможное значение.
Кстати, еще читал, что в math.h есть ф-ция random, но не нашел ее описания на русском - не подскажете?
tutejshy вне форума Ответить с цитированием
Старый 10.07.2017, 09:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, это генератор не случайных чисел, это генератор ПСЕВДОСЛУЧАЙНЫХ чисел.

Цитата:
Сообщение от tutejshy Посмотреть сообщение
то вот с srand не оч.
во-вторых, генератор построен на математической последовательности.
Последовательность нужно начать. Вот для иницилизации последовательности и используется функция srand()
если ей подать число 1 в качестве параметра - по получите ОДНУ строго определённую последовательности чисел.
если ей подать число 2 в качестве параметра - по получите ДРУГУЮ строго определённую последовательности чисел.
если ей подать число 3 в качестве параметра - по получите ДРУГУЮ строго определённую последовательности чисел.
и т.д.

вот, чтобы последовательность была заранее неизвестной, берём текущее для иницилизации - значение милисекунд из системных часов.

Вот и всё.


Цитата:
Сообщение от tutejshy Посмотреть сообщение
но компилятор при этом выдает предупреждение, мол невозможное значение.
смотрите в своём языке/компиляторе. Вполне возможно, что функция srand() в вашем случае запускается БЕЗ параметров (и уже она сама берёт нужное число из системных часов для иницилизации).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.07.2017, 10:02   #3
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

нет, пробовал - выдает одно и тоже число.
tutejshy вне форума Ответить с цитированием
Старый 10.07.2017, 10:04   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
нет, пробовал - выдает одно и тоже число.
что и как пробовали, и что именно выдаётся?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.07.2017, 10:08   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот, попробуйте:
Код:
#include <iostream>
using namespace std;

int main() {
 	srand(time(0));
 	for (int i=1; i<=10;i++) cout<<rand()%201+200; 
	return 0;
}
код взял тут

проверить работу можно онлайн на http://ideone.com- ТЫЦ
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.07.2017, 10:27   #6
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Цитата:
вот, попробуйте:
Это Си++, а я программирую в Си - забыл уточнить в вопросе.

Цитата:
что и как пробовали, и что именно выдаётся?
Код:
srand ();
a = 0 + rand() % 9;
При запуске проги все время выдается 2 - вот и все.
tutejshy вне форума Ответить с цитированием
Старый 10.07.2017, 10:38   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не знаю, ищите проблемы в своём компляторе.
на ideone всё работает - ТЫЦ

Код:
#include<stdio.h>
#include<unistd.h>
#include<time.h>

int main(void) {
	srand(time(NULL));
	int a = rand()%9;
	printf("%d",a);
	return 0;
}
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.07.2017, 10:47   #8
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Это понятно. что работает - у меня тоже работает, но если компилятор запускать с флагом -Wall, то выдает предупреждение.
tutejshy вне форума Ответить с цитированием
Старый 10.07.2017, 11:23   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
Это понятно. что работает - у меня тоже работает
так. значит, всё таки, работает.
Это уже хорошо.


Цитата:
Сообщение от tutejshy Посмотреть сообщение
если компилятор запускать с флагом -Wall, то выдает предупреждение.
ну, предупреждение, это не ошибка.
А что за предупреждение?
(я язык С не знаю, поэтому я Вам вряд ли помогу. Но тут на форуме есть специалисты, возможно, они Вам подскажут, что это за предупреждение и надо ли на него обращаться внимание...)


и, кстати, если предупреждение вида "warning: implicit declaration of function 'srand' is invalid in C99" - то, насколько я понял, просто нужно правильно подключить библиотеки, в C99 перенесли некоторые функции в другие библиотеки.

Последний раз редактировалось Serge_Bliznykov; 10.07.2017 в 11:27.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.07.2017, 13:32   #10
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

предупреждение типа:
Цитата:
rand_array.c: In function ‘randArr’:
rand_array.c:9:12: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration]
srand (time (NULL));
^
tutejshy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
генератор случайных чисел lazunit Помощь студентам 1 20.04.2013 10:05
генератор случайных чисел Nicolas_46 Microsoft Office Excel 9 03.12.2012 14:35
Генератор случайных чисел Evgenii(Евгений) Помощь студентам 6 23.01.2011 22:41
Генератор случайных чисел Костян Пират Общие вопросы Delphi 8 23.01.2011 22:08
генератор случайных чисел на С++ ANTI Общие вопросы C/C++ 20 12.04.2009 13:02