Вопрос 1: как нашёл в описании в MSDN, эта функция выдаёт случайные числа до 32768. В одной программе на C++ эта функция используеться, и выдаёт числа, но они при каждом запуске не разные, а повторяються в определённой последовательности, так и должно быть? Хотел бы узанть принцип работы rand() Вопрос 2: нашёл в masm32.lib функцию nrandom, и она нормально работает, только числа выдаёт по настоящему случайные каждый раз. Есть на асме аналог rand()?
Код (Text): ; ANSI Standard random number generator or another standart ansi_rand proc .data ParkerM dd 80000000h - 1 .code ; seed = seed * 0x41C64E6Du + 0x3039u; (ansi) ; Генератор из книги Зубкова С.В.=> a=1 664 525, c=1 013 904 223 ; a=015A4E35h,c=1 (BC) ; VC++6: a=343FDh,c=269EC3h и команда imul !!! ; Генератор Парка-Миллера: a=7^5,c=0,m=2^31-1 mov eax,343FDh imul dword ptr seed ; У VC - imul, остальные - mul ! add eax,269EC3h mov dword ptr seed,eax ; return (seed>>0x10)&0x7FFF; shr eax,16 and eax,07FFFh ret ansi_rand endp Функция srand(...) инициализирует seed. Обычно пишут srand(time(NULL));. Все это так называемые конгруэнтные генераторы. В линуксе есть 48-ми битный drand48.
Нонсенс. Она инициализируется каждый раз одним и тем же seed - 12345678, поэтому не может выдавать при разных запусках программы разные последовательности.
Chib777 На сайте Агнера Фога есть оптимизированный исходный код на асме, Marsaglia: "Mother of Randum Number", так вроде пишется он тебе на долго хватит, т.к. у него 2^250
Mersenne twister Быстрый - без операций деления. Обгоняет Сишный rand() Период 2^19937-1 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/ASSEM-DLL/ass em-dll.html Это асмовые исходники. Главная - http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
Тут грелку делал (CPU/ALU) для соседней ветки, случайно получилось тоже что-то вроде генератора псевдо-случайных чисел (но наверняка с малым периодом): Код (Text): context dd 0, 0, 0 ... mov eax, [context + 0] mov edx, [context + 4] mov ecx, [context + 8] xor eax, 101010101h ; in eax must be initial value xadd ecx, edx lea edx, [eax + ecx] rcl eax, 15 xor edx, ecx rcr ecx, 17 xadd ecx, eax xor eax, edx mov [context + 0], ecx mov [context + 4], edx mov [context + 8], eax Вобщем как-что с числами-незнаю, а проц греет.
рИальные паЦЦаны юзают синус для рандома Код (Text): mov ecx,12345 ; sizeof buffer mov edi,buffer finit @@: push ecx fild dword [esp] fsin fstp dword [esp] pop eax stosb loop @b