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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.97
CAYOT
0 / 0 / 0
Регистрация: 10.10.2009
Сообщений: 26
#1

rand() & srand() - C++

10.10.2009, 15:51. Просмотров 8231. Ответов 7
Метки нет (Все метки)

кто знает как работает пара функции rand() и srand().
я знаю как это пара функци работает.мне всегда интересовало как это зделано .одно очевидно что один из них берет время системы.а как они связаны не понимаю
может быть кто то понял как это все работает?объясните пожалуйста.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
2935 / 1279 / 237
Регистрация: 19.01.2009
Сообщений: 3,343
Завершенные тесты: 1
10.10.2009, 16:52     rand() & srand() #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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/***
*rand.c - генератор случайных чисел
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Описание:
*       defines rand(), srand() - генератор случайных чисел
*
*******************************************************************************/
 
#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>
 
#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */
 
/***
*void srand(seed) - начальное значение ГСЧ
*
*Назначение:
*       Установка указанного в параметре начального значения генератора случайных
*       чисел. Адаптирован из BASIC.
*
*Параметры:
*       unsigned seed - начальное значение
*
*Выход:
*       нет.
*
*Исключения:
*
*******************************************************************************/
 
void __cdecl srand (
        unsigned int seed
        )
{
#ifdef _MT
 
        _getptd()->_holdrand = (unsigned long)seed;
 
#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}
 
 
/***
*int rand() - возвращает случайное число
*
*Назначение:
*       возвращает псевдо-случайное число в интервале 0 до 32767.
*
*Параметры:
*       None.
*
*Выход:
*       возвращает псевдо-случайное число в интервале 0 до 32767.
*
*Исключения:
*
*******************************************************************************/
 
int __cdecl rand (
        void
        )
{
#ifdef _MT
 
        _ptiddata ptd = _getptd();
 
        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
 
#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}
Добавлено через 6 минут
Пояснения нужны?
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.10.2009, 16:54     rand() & srand() #3
2polivets: Ты думаешь автор понял этот код ?
одно очевидно что один из них берет время системы
Не очевидно и не берет
CAYOT
0 / 0 / 0
Регистрация: 10.10.2009
Сообщений: 26
10.10.2009, 17:15  [ТС]     rand() & srand() #4
_ptiddata-?
_getptd();-?
никак не могу найти...
#include <cruntime.h>
#include <mtdll.h>
не открывает...

>>2polivets: Ты думаешь автор понял этот код ?
>>
>>Цитата:
>>одно очевидно что один из них берет время системы
>>
>>Не очевидно и не берет

представ себе я понял..но не все...
не берет сам даешь этим путем srand(time(NULL));

_MT-в каком header file этот define?и что оно означает?

Добавлено через 2 минуты
и кстати до этого кода я тоже докопался...s F11..
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.10.2009, 18:11     rand() & srand() #5
MT - это видимо multithread, если тебе это о чем-нибудь говорит
CAYOT
0 / 0 / 0
Регистрация: 10.10.2009
Сообщений: 26
10.10.2009, 19:02  [ТС]     rand() & srand() #6
нет жаль но не говорить...объясни пожалуйста
schdub
2935 / 1279 / 237
Регистрация: 19.01.2009
Сообщений: 3,343
Завершенные тесты: 1
10.10.2009, 19:42     rand() & srand() #7
Цитата Сообщение от odip Посмотреть сообщение
Ты думаешь автор понял этот код ?
2odip а чего тут не понятного-то. Лучший мануал для программера - это исходник.

_ptiddata- это указатель на сруктуру с инфой о треде
_tiddata - соответсвено сама структура здоровенная такая (mtdll.h)
_getptd() - функция, возвращающая указатель на энту структуру, для треда из которого она запущена.

декларация символа _MT на сам алгоритм вообще, просто для каждого треда число от которого начинает плясать ГСЧ хранятся в этой структуре. Самые главные это строки 47 и 80 - могли бы заменить вызовы функция srand() и rand(), ну и конечно статик переменную не забыть объявить, чтобы хранить сид.

Если тебе нужен алгоритм посложнее, то могу запостить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2009, 21:41     rand() & srand()
Еще ссылки по теме:

C++ srand(), rand() и их seed
Различия srand() и rand() C++
C++ Объясните что делает эта программа (for,rand,srand)
Srand C++
Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) C++

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

Или воспользуйтесь поиском по форуму:
CAYOT
0 / 0 / 0
Регистрация: 10.10.2009
Сообщений: 26
10.10.2009, 21:41  [ТС]     rand() & srand() #8
spasibo
Yandex
Объявления
10.10.2009, 21:41     rand() & srand()
Ответ Создать тему
Опции темы

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