Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работает random() или rand(), каким образом генерируют случайные числа 
:(
    Опции темы
ano360
Дата 16.1.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Как работает random() или rand()
каким образом генерируют случайные числа
Просто для расширения кругозора интересно было бы узнать, каким образом компьютор модет выдать случайное число. Откуда он его бкрёт. Там кажется что-то со времяем связано


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 16.1.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(ano360 @  16.1.2007,  22:04 Найти цитируемый пост)
каким образом генерируют случайные числа

Они псевдо случайны, и вычисляются на основе формулы с некоторым начальным значением, которое может быть как функция времени. есть несколько алгоритмов.
http://en.wikipedia.org/wiki/Random_number_generator
PM MAIL WWW   Вверх
Romikgy
Дата 16.1.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(ano360 @  16.1.2007,  20:04 Найти цитируемый пост)
Как работает random() 

по крайней мере в билдере
Код

#if defined(__cplusplus)
inline int  _RTLENTRY random(int __num)
                       { return __num ? (int)(_lrand()%(__num)) : 0; }
#else /* __cplusplus */
#define random(__num) (__num ? (int)(_lrand()%(__num)) : 0)
#endif  /* __cplusplus  */

вот реализация _lrand (т.к. работа идет с двойными словами, мя схарило переводить на си)
Код

326749CC 53               push ebx
326749CD 56               push esi
326749CE E8399D0000       call +0x00009d39
326749D3 8B5848           mov ebx,[eax+0x48]
326749D6 E8319D0000       call +0x00009d31
326749DB 8B7044           mov esi,[eax+0x44]
326749DE 8BC3             mov eax,ebx
326749E0 B95A010000       mov ecx,0x0000015a
326749E5 BB354E0000       mov ebx,0x00004e35
326749EA 85C0             test eax,eax
326749EC 7402             jz +0x02
326749EE F7E3             mul ebx
326749F0 91               xchg eax,ecx
326749F1 F7E6             mul esi
326749F3 03C1             add eax,ecx
326749F5 96               xchg eax,esi
326749F6 F7E3             mul ebx
326749F8 03D6             add edx,esi
326749FA 83C001           add eax,0x01
326749FD 83D200           adc edx,0x00
32674A00 8BD8             mov ebx,eax
32674A02 8BF2             mov esi,edx
32674A04 E8039D0000       call +0x00009d03
32674A09 895844           mov [eax+0x44],ebx
32674A0C E8FB9C0000       call +0x00009cfb
32674A11 897048           mov [eax+0x48],esi
32674A14 8BC6             mov eax,esi
32674A16 25FFFFFF7F       and eax,0x7fffffff
32674A1B 5E               pop esi
32674A1C 5B               pop ebx
32674A1D C3               ret 

все колы (ф_ции) идут сюда (смысл их я не понял smile)
Код

32601202 833D9B52683200   cmp dword ptr [0x3268529b],0x00
32601209 750A             jnz +0x0a
3260120B E81CD10700       call cc3260mt.___CRTL_TLS_Alloc
32601210 A39B526832       mov [0x3268529b],eax
32601215 FF359B526832     push dword ptr [0x3268529b]
3260121B E84CD30700       call cc3260mt.___CRTL_TLS_GetValue
32601220 85C0             test eax,eax
32601222 7401             jz +0x01
32601224 C3               ret 
32601225 E80DFFFFFF       call -0x000000f3
3260122A A19B526832       mov eax,[0x3268529b]
3260122F 50               push eax
32601230 E837D30700       call cc3260mt.___CRTL_TLS_GetValue
32601235 C3               ret 



Цитата(ano360 @  16.1.2007,  20:04 Найти цитируемый пост)
rand()

Код

static int z;
void rand()
{
z=z*0x015a4e35+1;
return (z>>10)&0x7fff;
}


Это сообщение отредактировал(а) Romikgy - 16.1.2007, 23:07


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
KpoHyc
Дата 17.1.2007, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 23.12.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 5



вот пример работы рандома:

Код

#include <time.h>

***

int GtRnd(int range){
    return rand()%(range+1);
}

void main( void )
{
  int N;  
  srand(time(NULL));
  N = GtRnd(100);
}

--------------------
AScript + Pascal + C -> C++ ->C#Adobe Photoshop 7.0/CS 2.0 + GIMP+ Visual Studio .NET(sp1)/2005 pro(sp1)
PM MAIL ICQ Skype GTalk Jabber   Вверх
ano360
Дата 17.1.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Цитата

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

Немного понятно

К сожалению английским владею плохо

Romikgy-и асемблера я тоже не знаю

Цитата

static int z;
void rand()
{
z=z*0x015a4e35+1;
return (z>>10)&0x7fff;
}

Можно поподробней смысл этого кода.

в часности строку (z>>10)&0x7fff;

Цитата

int GtRnd(int range){
    return rand()%(range+1);
}
 Ну это и так понятно, вопрос состоял в том, как генерируется случ.  число


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 17.1.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



надеюсь , хоть что такое шестнадцатиричные числа ты знаешь что это.
Цитата(ano360 @  17.1.2007,  15:43 Найти цитируемый пост)
z=z*0x015a4e35+1;

есть переменая z которая имеется одна грубо говоря в твоей проге и отвечает за генератор случ. чисел
так вот 
при твоей просьбе дать те число случайное происходят такие действия
число зет умножается на 
Цитата(ano360 @  17.1.2007,  15:43 Найти цитируемый пост)
0x015a4e35

и после этого к нему добавляется единица
далее для получения ответа
мы сдвигаем число зет на 10 битов вправо
Цитата(ano360 @  17.1.2007,  15:43 Найти цитируемый пост)
(z>>10)

и делаем логическое и с ниже приведеным числом
Цитата(ano360 @  17.1.2007,  15:43 Найти цитируемый пост)
&0x7fff

все эти сдвиги и логические операции нужны для того чтобы
ответ те был дан в пределах разумного числа! (по разрядности)


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
ano360
Дата 23.1.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 22.5.2006
Где: Москва

Репутация: нет
Всего: нет



Romikgy-круто


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
nworm
Дата 23.1.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 1
Всего: 8



По аналогии с соседней темой
вот тут все в полном объеме:
Дональд Э. Кнут Искусство программирования том 2
 smile 
PM MAIL WWW   Вверх
PoloS
Дата 23.1.2007, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 29.12.2006
Где: МО, г. Одинцово

Репутация: 1
Всего: 5



Цитата(nworm @ 23.1.2007,  18:45)
По аналогии с соседней темой
вот тут все в полном объеме:
Дональд Э. Кнут Искусство программирования том 2
 smile

начало =)

ЗЫ. Плагиат  smile 
PM MAIL ICQ   Вверх
BobiKK
Дата 23.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: 1
Всего: 16



PM MAIL   Вверх
Romikgy
Дата 23.1.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



имхо спрашивали как работает стандартное , а не как написать свое


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
PoloS
Дата 23.1.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 29.12.2006
Где: МО, г. Одинцово

Репутация: 1
Всего: 5



Цитата(Romikgy @ 23.1.2007,  20:17)
имхо спрашивали как работает стандартное , а не как написать свое

Просто для расширения кругозора интересно было бы узнать, каким образом компьютор модет выдать случайное число. Откуда он его бкрёт. Там кажется что-то со времяем связано


PM MAIL ICQ   Вверх
Romikgy
Дата 23.1.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(PoloS @  23.1.2007,  19:31 Найти цитируемый пост)
ам кажется что-то со времяем связано

Код

#define randomize() srand((unsigned)time(NULL))



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
W4FhLF
Дата 24.1.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Да это стандартный линейный конгруэнтный метод, чё тут обсуждатьsmile 
Каждое следующее значение будет зависеть от предыдущего "сгенерированного" значения(начальное значение задаётся значением seed). 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.