Как сделать генератор случайных чисел?

#define MULTIPLIER 0x015a4e35L
#define INCREMENT 1
int _RTLENTRY _EXPFUNC rand(void)
{
Seed.lo = MULTIPLIER * Seed.lo + INCREMENT;
return((int)(Seed.lo >> 16) & 0x7fff);
}

typedef struct
{
unsigned lo;
unsigned hi;
} __seed_t;

static __seed_t Seed = ;

Инициализация
Seed.lo = 1;
Seed.hi = 0;
Давай так: я расскажу немного теории. Что на это говорил Д.Кнут: Можно получать псевдослучайные числа таким образм: Xn+1 = ( A*Xn+c ) mod M
M > 0 -модуль,
0 <= A < M - множитель,
0 <= c < M приращение
Xn - предидущее случайное( ) число.
Xn+1 - последующее.
Берём как-нить по хитрому задаём X0. Например, мутим чего-нить с часами. А потом вычисляем X1, X2 ....... Хорошие результаты даёт: M - чем больше, тем лучше. Кнут рекомендует 2^32. ИМХО многовато. Берём 2^10...2^20; A берём делителем M максимальной кратности, т.е A=2 c - от балды. Особо не влияет на длину последовательности. Но лучше почитай Кнута. Там подробнее описано чем я тебе тут втираю.
Да, кстати, вдруг не знаешь:
A mod B=остаток от деления A на B.
5 mod 2=3
18mod3=0
Давным-давно нацарапал процедурку, может разберешься ...
;
; char *cmostime(char str[9]);
;
.model large
.code

intrans proc near
out 070H,al
jmp $+2
in al,071H
mov ah,dh
mov cl,4
rol ax,cl
ror al,cl
add ah,dl
add al,dl
mov es:[si],ah
inc si
mov es:[si],al
inc si
ret
intrans endp

incolon proc near
mov es:byte ptr [si],03AH
inc si
ret
incolon endp

public _cmostime
_cmostime proc far
push bp
mov bp,sp
push si
push di
mov di,[bp+8]
mov si,[bp+6]
mov es,di
mov dx,0030H
mov al,004H
call intrans
call incolon
mov al,002H
call intrans
call incolon
mov al,000H
call intrans
mov es:[si],dh
mov dx,word ptr [bp+8]
mov ax,word ptr [bp+6]
pop di
pop si
pop bp
ret
_cmostime endp
end
Не морочте человеку голову ... Пусть заберает число из порта 41H т.е. in al,041h !!! Всего одна команда, и псевдо случайное число у вас. Кто сделает короче???
Вот тебе нормальная процедура получения случайного числа в промежутке [0,rand_num-1] ;-------------------------------------------------------------------------------
;Получаем порядок (выборка) рандомизации
randomize proc
push ax dx cx
mov ah,2ch ; Определяем время используя системный таймер
int 21h
mov word ptr ds:[rand_seed],cx ; ch - час, cl - минута,
mov word ptr ds:[rand_seed+2],dx ; dh - секунда, dl - сотая доля секунды
pop cx dx ax
ret
randomize endp
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------

;Генерация случайного числа в диапазоне от 0 до rand_num-1
; in: rand_num - диапазон
;out: rand_num - число от 0 до rand_num-1
random proc push ax bx cx dx si di
mov cx,rand_num ; Предельное значение случайного числа
mov ax,word ptr ds:[rand_seed+2]
mov bx,word ptr ds:[rand_seed]
mov si,ax mov di,bx
mov dl,ah
mov ah,al
mov al,bh
mov bh,bl
xor bl,bl
rcr dl,1
rcr ax,1
rcr bx,1
add bx,di
adc ax,si
add bx,62e9h
adc ax,3619h
mov word ptr ds:[rand_seed],bx
mov word ptr ds:[rand_seed+2],ax
xor dx,dx
div cx
mov rand_num,dx
pop di si dx cx bx ax
ret random
endp
;-------------------------------------------------------------------------------
;--------------------------------------------------------------------------------

TopList Rambler's Top100