1. |
Veletlenszam-generalas (mind) |
83 sor |
(cikkei) |
2. |
Re: [rnd] Veletlen generalas nem egeszen veletlenul (mind) |
11 sor |
(cikkei) |
3. |
[re: RND] [GFX teruletszamitas] (mind) |
70 sor |
(cikkei) |
4. |
Elojel fuggveny optimalizalas (mind) |
35 sor |
(cikkei) |
|
+ - | Veletlenszam-generalas (mind) |
VÁLASZ |
Feladó: (cikkei)
|
Hi, Gabor (es minden coder)!
Veletlen szamokat sokfelekeppen lehet kepezni. Nekem a legszimpatikusabb
D. A. Lehmer modulo modszere volt. Ennek az alapja:
R(n+1) = (a * R(n) + C) mod m
Az R-nek az elejen valamilyen kezdoerteket kell adni.
Az a, C es m szamokat elore kell megvalasztani. Nem mindegy azonban, mit
valasztasz, csak bizonyos szamok eseten mukodik jol. Hogy mik ezek a szamok,
annak Knuth: A szamitogepprogramozas muveszete c. konyvben nezhetsz utana.
(Es ha utananezel, irj rola, ugyanis ezt en sem tudom. :) )
Itt van ket Pascal eljaras, es egy assembly programreszlet. Nezzuk eloszor
a Pascalt. Az elso eljaras egesz szamokat csinal 0 es es a megadott hatar-1
intervallumban, a masodik valosakat 0-1 kozott. A kezdoertekeket az rn es
az a2 valtozok taroljak. Hatranya, hogy hianyzik belole a TP randomize elja-
rasa, igy mindig ugyanolyan ertekrol indul.
program randomnumbers;
uses crt;
var
i: integer;
const
rn: longint = 203;
function rnd1(a:word):word;
begin
rn:=(10001*rn+3) mod 17417;
rnd1:=trunc(a*rn/17417);
end;
const
a2 : Integer = 203;
function rnd2 : Real;
var t : longint;
begin
t:=(a2*10001+3) mod 17417;
a2:=trunc(t);
rnd2:=Abs(t/17417);
End;
.
Es most jojjon az assembly. Oops, a randomize eljaras nincs meg, pedig azzal
nem mindig ugyanolyan ertekrol indulna (tisztara, mint a Pascal :) ).
rn DD 203
a EQU 10001
c EQU 3
m EQU 17417
random PROC C limit:word
mov ax,word ptr [rn] ; a*R(n)+C
mov bx,a
mul bx
add ax,c
mov word ptr [rn+2],dx ; rn longint eredmeny
mov word ptr [rn],ax
mov bx,m ; (a*R(n)+C) div m
div bx
mul bx ; (a*R(n)+C) mod m
sub word ptr [rn],ax
sbb word ptr [rn+2],dx
mov ax,word ptr [rn] ; a maradek ax-be kerul
mov bx,limit
mul bx
mov bx,m
div bx
RET
random ENDP
A randomize eljarashoz a valos ideju ora lekerdezese megszakitast kell meghivni
,
aminek most nem tudom a szamat. Azt hiszem, az eredmeny CX, DX regiszterekben
jon.
Ilyen egyszeru lenne az egesz.
|
+ - | Re: [rnd] Veletlen generalas nem egeszen veletlenul (mind) |
VÁLASZ |
Feladó: (cikkei)
|
Haho CODER-ek!
Eloszor is nagyon egyetertek Kovacs Antal Temakor szelektalas cime
cikkevel. Sokkal optimalisabb lenne [] koze subj-ba tenni a temat.
A veletlenszam problemara pedig kicsit matematikusabb megoldas, hogy pl
a nulla es egy kozotti 'sima' veletlenszamot ha negyzetre emeled, akkor
is nulla es egy kozotti lesz, de 'inkabb 1 fele lesz. Magasabb
hatvanyokra meg jobban. Aztan ezt az intervallumot lehet tologatni.
Paaa : Fuge
|
+ - | [re: RND] [GFX teruletszamitas] (mind) |
VÁLASZ |
Feladó: (cikkei)
|
[RND]
Ime a pascal random fuggvenye: eleg bonyolult,
de jo. Azert van egyszerubb is, bar az nem
ennyire veletlenszeru, mondjuk amikor egymas
utan rakunk egy rakas SUB, XOR, ADD megy ilyeneket :)
const
randSeed:longint=0;
Factor:word=$8405;
procedure NextRand;assembler;
asm
MOV AX,RandSeed[0].word
MOV BX,RandSeed[2].word
MOV CX,AX
MUL CS:Factor {;New = Old.w0 * 8405H}
SHL CX,1 {;New.w2 += Old.w0 * 808H}
SHL CX,1
SHL CX,1
ADD CH,CL
ADD DX,CX
ADD DX,BX {;New.w2 += Old.w2 * 8405H}
SHL BX,1
SHL BX,1
ADD DX,BX
ADD DH,BL
MOV CL,5
SHL BX,CL
ADD DH,BL
ADD AX,1 { ;New += 1}
ADC DX,0
MOV RandSeed[0].word,AX
MOV RandSeed[2].word,DX
end;
function RandInt(a:word):word;assembler;
asm
CALL NextRand
MOV BX,SP
MOV CX,DX
MUL a
MOV AX,CX
MOV CX,DX
MUL a
ADD AX,CX
ADC DX,0
MOV AX,DX
end;
.
Ja es persze a lenyeg:
Copyright (c) 1988,92 Borland International
bar egy kicsit belebaromkodtam :)
[GFX] teruletszamitas
Kerdes: minek a teruletet szamolhatom ki a kovi keplettel:
T=a+b/2-1 ahol 'a' es 'b' egesz szam
Ja, hogy ez nem a jatekos lista? Akkor bocs! Amugy erdekes :)
Bye,
Tooth 'Gabry' Gaabor
mailto:
post:H-4001 Debrecen P.O. Box 515, HUNGARY
|
+ - | Elojel fuggveny optimalizalas (mind) |
VÁLASZ |
Feladó: (cikkei)
|
Hi Coders!
Egy kis problemam tamadt.
Itt van egy elojel vizsgalo:
Function Sign ( number : Integer ) : Integer; Near; Assembler;
{
Function Sign ( Number : Integer) : Integer;
begin
If Number < 0 then Sign := -1;
If Number = 0 then Sign := 0;
If Number > 0 then Sign := +1;
end;
}
ASM {Optimized -1, 0, +1}
{3} mov dx, number;
{2} xor ax, ax;
{2} or dx, dx;
{2} js @Negativ
{2} je @Exit
{3} add ax, 2;
:
{1} dec ax;
:
END;
Ezzel nincs problemam, de
1. +1, -1, 0-ra opt. roviden?
2. -1, +1, 0-ra opt. roviden?
3. Makrot vagy fuggveny erdemesebb irni belole?
udv: XiX
-=- -=-
-=- Minden masodik szavam hazugsag -=-
-=- Az orokevalosagnak kell elni. Na bumm, legfeljebb nem sikerul -=-
|
|