· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Генератор случайных чисел

Посл.отвђт Сообщен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

Идешь сюда:
Win32ASM Community messageboard
Жмешь Search
Набираешь
random number generator


Дата: Апр 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