|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 1, 2003 15:51:11 Здравствуйте, нет ли у кого информации по генерации псевдослучайного числа с плавающей точкой с равномерным распределением на интервале 0..1. Желательно линк на исходник на АСМе соотвественно. |
|
|
Дата: Апр 1, 2003 16:21:40 Обычный конгруэнтный генератор, но на выходе его результат делится на MAX_RAND. Например, генератор ANSI: seed = seed * 0x41C64E6Du + 0x3039u; (ansi) return (seed>>0x10)&0x7FFF Выдает числа в диапазоне [0,7FFFFh], MAX_RAND=0x8000, если его выход делить на 0x8000, то получишь real. Ниже приводится "слизанный" с linux'ового drand48 генератора real-чисел мой код: [CODE] .data? __x dw 4 dup(?) FloatResult dq ? .data __a dq 25214903917 ; 05DEECE66Dh ; 3740067437 __c dd 11 MaxRand dq 1000000000000h FloatResultStr db "drand48=?.???????????????????? ",0Ah .code srand48 proc mov word ptr __x,13070 mov dword ptr __x+2,eax ret srand48 endp drand48 proc .data? ReqMaxRand dd ? result dd ? .code push ecx push edx ; save Req_max_rand mov dword ptr ReqMaxRand,eax ; __x = (__x*a+__c) mod 2^48 mov eax,dword ptr __x mul dword ptr __a+4 mov ecx,eax movzx eax,word ptr __x+4 mul dword ptr __a add ecx,eax mov eax,dword ptr __x mul dword ptr __a add eax,11 adc edx,ecx mov dword ptr __x,eax and edx,0FFFFh mov dword ptr __x+4,edx ; ST(0)=(__x * ReqMaxRand) / MaxRand fild qword ptr MaxRand fild qword ptr __x fimul dword ptr ReqMaxRand fxch ST(1) fdivp ST(1),ST(0) call Set_FPUTruncType frndint fistp dword ptr result mov eax,dword ptr result pop edx pop ecx ret drand48 endp [/CODE] Он принимает в eax максимально допустимое целое и возвращает целое, но если делить _x на MAX_RAND = 1 000 0000 0000h, то получаешь именно оригинальный real. |
|
|
Дата: Апр 1, 2003 16:22:43 Спасибо большое. |
|
|
Дата: Апр 2, 2003 09:40:17 · Поправил: Four-F |
|
|
Дата: Апр 4, 2003 03:05:18 Идея: статистический генератор случайных чисел: при одних и тех-же стартовых параметрах выдаёт один и тот-же псевдослучайный ряд (думаю, хорошо для криптования) полная функция зависит от фантазии автора, что-нибудь типа: RANDOM db 'WASM' ........................ mov ax,[WORD RANDOM] add al,ah mov [RANDOM],al xor al,[RANDOM+2] mov [RANDOM+1],al ror al,3 mov [RANDOM+2],al sub al,[RANDOM+3] mov [RANDOM+3],al ..................... и так далее ... на выходе al - псевдослучайное число. |
|
|
Дата: Апр 4, 2003 08:59:36 идея генерации псевдослучайного числа происходит из того факта, что остаток от деления к-л числа на определенный полином будет иметь спектр, очень похожий на белый шум. беда лишь в том, что выбрать этот полином довольно сложно. но именно на делении построен алгоритм генерации случайного числа сдвиговым регистром. Еще более применяемым является алгоритм подсчета CRC - это тоже деление на заранее выбранный полином. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.034 |