Re: RND contest
- From: "¬a\\/b" <al@xxx>
- Date: Thu, 23 Feb 2006 13:51:50 +0100
On 23 Feb 2006 10:21:45 GMT, Betov <betov@xxxxxxx> wrote:
"¬a\\/b" <al@xxx> écrivait news:571rv1hn4ut95g7n9h9f9qqunpphl927u3@xxxxxxx:
i have too, my rand routines
Good. Why don't you propose them for the comparisons
tests? The actual version of the Contest is:
< http://betov.free.fr/RndCompare.exe >
Betov.
< http://rosasm.org >
the function for pseudo random number is
eax:uint RND_Multiineare(void);
it use 16 linear rand function and choice the next function from the
last returned number.
but here i don't put the routines that fill the base and the seed and
the seed0 with numbers. i wrote that numbers with hands. These
routines seems run good in a windows programme that i have
but here there are some problem for rosasm translation from nasm
or other
section _DATA public align=4 class=DATA use32
global ..start
base dd 729705821, 11705821, 128965421
dd 77731121, 1121, 717821, 4578721, 787821, 457821, 124521
dd 767221, 4578721, 7845421, 4875421, 98921, 4457821
seed dd 12333, 4433, 222, 44
dd 7358, 45737, 3333, 7878, 787472, 9888, 97811, 78455
dd 70844, 780454, 4544, 7877, 8704551
seed0 dd 123, 4578, 43745, 4913, 12585, 44312
dd 7874, 1548, 15789, 5848, 7844, 34566, 784841, 457121
dd 784123, 7848, 79182, 45113
index dd 0, 0
index1 dd 0, 0
basea dd 31415821
seeda dd 123
dieci dd 10, 0
cento dd 100, 0
cw_data dw 0000001101111111b
dw 0
section _TEXT public align=1 class=CODE use32
...start:
ret
; uint _RND_lineare_m()
; dd, .base=31415821, .seed=123;
_RND_lineare_m:
push edx
mov eax, [basea]
mul dword[seeda]
inc eax
mov [seeda], eax
pop edx
ret
; 0 r, 4 c, 8 Ra, 12 @Min, 16 @Max
_RND_RangeLineare_m:
push ecx
push edx
%define @Min [esp+12]
%define @Max [esp+16]
call _RND_lineare_m
mov ecx, @Max
sub ecx, @Min
cmp ecx, 0
jne .co
inc ecx
..co:
mov edx, 0
div ecx
mov eax, edx
add eax, @Min
%undef @Min
%undef @Max
pop edx
pop ecx
ret 8
; uint RND_MultiL(base, seed, seed0)
; 0 b, 4 r, 8 c, 12 Ra, 16@Base, 20@Seed, 24@Seed0
RND_MultiL:
push ecx
push edx
push ebx
%define @Base [esp+16]
%define @Seed [esp+20]
%define @Seed0 [esp+24]
mov edx, @Base
mov ecx, @Seed
mov ebx, [edx]
mov eax, [ecx]
mul ebx
inc eax
mov edx, @Seed0
mov edx, [edx]
mov [ecx], eax
cmp eax, edx
jne .con
call _RND_lineare_m
xor eax, ebx
test eax, 1
jnz .l0
inc eax
..l0: ; cambia base ma dispari
mov edx, @Base
mov [edx], eax
call _RND_lineare_m ; cambia seed0
mov edx, @Seed0
xor [edx], eax
mov eax, @Seed ; cambia seed=seed0 e lo ritorna
mov edx, [edx]
mov [eax], edx
mov eax, edx
..con:
%undef @Base
%undef @Seed
%undef @Seed0
pop ebx
pop edx
pop ecx
ret 12
; eax:uint RND_Multilinear(void);
; risultato in eax numero pseudocasuale tra 0 e 0x7FFFFFFF
_RND_Multilinear_m:
push ebx
push ecx
push edx
mov eax, [index1]
lea ebx, [base+ 4*eax]
lea ecx, [seed+ 4*eax]
lea edx, [seed0+ 4*eax]
push edx
push ecx
push ebx
call RND_MultiL
shr eax, 1
mov bl, ah
and ebx, 0Fh
mov [index1], ebx
bswap eax ; 0..7<->24..31, 8..15<->16..23
test eax, 0x80000000
jz .cil
or ax, 0x80
and eax, 0x7FFFFFFF
..cil:
pop edx
pop ecx
pop ebx
ret
; eax:uint _RND_RangeMLineare_m(uint min, uint max)
; risultato in eax numero pseudocasuale tra min e max
; 0 r, 4 c, 8 Ra, 12 @Min, 16 @Max
_RND_RangeMLineare_m:
push ecx
push edx
%define @Min [esp+12]
%define @Max [esp+16]
call _RND_Multilinear_m
mov ecx, @Max
sub ecx, @Min
cmp ecx, 0
jne .co
inc ecx
..co:
mov edx, 0
div ecx
mov eax, edx
add eax, @Min
%undef @Min
%undef @Max
pop edx
pop ecx
ret 8
--------------------
/* uint _RND_lineare_m()
/* dd, .base=31415821, .seed=123;
_RND_lineare_m:
< r
a = *basea;
mul D*seeda;
++a;
*seeda=a;
rret
/* 0 r, 4 c, 8 Ra, 12 @Min, 16 @Max
_RND_RangeLineare_m:
< c, r
<< @Min=[s+12], @Max=[s+16]
_RND_lineare_m();
c=@Max; c-=@Min;
c#.co|++c;
..co: r=0; div c
a=r; a+=@Min;
ret 8@Min, @Maxc, r
/* uint RND_MultiL(base, seed, seed0)
/* 0 b, 4 r, 8 c, 12 Ra, 16@Base, 20@Seed, 24@Seed0
RND_MultiL:
< c, r, b
<< @Base=[s+16], @Seed=[s+20], @Seed0=[s+24]
r=@Base; c=@Seed;
b=*r; a=*c; mul b; ++a;
r=@Seed0; r=*r; *c=a;
a == r !#.con
{_RND_lineare_m(); a^=b;
a&1; !#.l0 | ++a;
..l0: r=@Base; *r=a; /* cambia base ma dispari
_RND_lineare_m(); r=@Seed0; *r^=a; /* cambia seed0
a=@Seed; r=*r; *a=r; a=r; /* cambia seed=seed0 e lo ritorna
}
..con:
ret 12@Base, @Seed, @Seed0c, r, b
/* eax:uint RND_Multiineare(void);
/* risultato in eax numero pseudocasuale tra 0 e 0x7FFFFFFF
_RND_Multilinear_m:
< b, c, r
a=*index1
b= &[base+ 4*a]; c= &[seed+ 4*a]; r= &[seed0+ 4*a];
RND_MultiL(b, c, r);
a>>=1; bl=ah; b&=0Fh; *index1=b;
bswap a; /* 0..7<->24..31, 8..15<->16..23
a & 0x80000000 | jz .cil
{ax|=0x80; a&=0x7FFFFFFF;}
..cil:
b, c, rret
/* eax:uint _RND_RangeMLineare_m(uint min, uint max)
/* risultato in eax numero pseudocasuale tra min e max
/* 0 r, 4 c, 8 Ra, 12 @Min, 16 @Max
_RND_RangeMLineare_m:
< c, r
<< @Min=[s+12], @Max=[s+16]
_RND_Multilinear_m();
c=@Max; c-=@Min;
c#.co|++c;
..co: r=0; div c
a=r; a+=@Min;
ret 8@Min, @Maxc, r
.
- Follow-Ups:
- Re: RND contest
- From: Betov
- Re: RND contest
- References:
- RND contest
- From: Betov
- Re: RND contest
- From: Alex McDonald
- Re: RND contest
- From: \\\~\o/~///annabee
- Re: RND contest
- From: Alex McDonald
- Re: RND contest
- From: Betov
- Re: RND contest
- From: Alex McDonald
- Re: RND contest
- From: Betov
- Re: RND contest
- From: ¬a\\/b
- Re: RND contest
- From: Betov
- RND contest
- Prev by Date: Re: Status of LuxAsm?
- Next by Date: Re: Ideal computer language from scratch?
- Previous by thread: Re: RND contest
- Next by thread: Re: RND contest
- Index(es):
Relevant Pages
|