Hollosi Information eXchange /HIX/
HIX CODER 92
Copyright (C) HIX
1998-04-29
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
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 -=-

AGYKONTROLL ALLAT AUTO AZSIA BUDAPEST CODER DOSZ FELVIDEK FILM FILOZOFIA FORUM GURU HANG HIPHOP HIRDETES HIRMONDO HIXDVD HUDOM HUNGARY JATEK KEP KONYHA KONYV KORNYESZ KUKKER KULTURA LINUX MAGELLAN MAHAL MOBIL MOKA MOZAIK NARANCS NARANCS1 NY NYELV OTTHON OTTHONKA PARA RANDI REJTVENY SCM SPORT SZABAD SZALON TANC TIPP TUDOMANY UK UTAZAS UTLEVEL VITA WEBMESTER WINDOWS