| 
		| 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 -=- |  |