Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как работает random() или rand()


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

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

Они псевдо случайны, и вычисляются на основе формулы с некоторым начальным значением, которое может быть как функция времени. есть несколько алгоритмов.
http://en.wikipedia.org/wiki/Random_number_generator

Автор: Romikgy 16.1.2007, 22:46
Цитата(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;
}

Автор: KpoHyc 17.1.2007, 00:08
вот пример работы рандома:

Код

#include <time.h>

***

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

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

Автор: ano360 17.1.2007, 16:43
Цитата

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

Немного понятно
Цитата

http://en.wikipedia.org/wiki/Random_number_generator 

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

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);
}
 Ну это и так понятно, вопрос состоял в том, как генерируется случ.  число

Автор: Romikgy 17.1.2007, 16:56
надеюсь , хоть что такое шестнадцатиричные числа ты знаешь что это.
Цитата(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

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

Автор: ano360 23.1.2007, 18:41
Romikgy-круто

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

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

начало =)

ЗЫ. Плагиат  smile 

Автор: BobiKK 23.1.2007, 18:59
http://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB

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

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

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


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

Код

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)