Sign in Join
Wiki copytemporary

Revision 3 of 4, by WikiArchive on 11-4-2026. The page as it is now.

Generating Random Numbers/fi

Contents

Satunnaisluvut

fpc source logo.png

Satunnaisluvut ovat tärkeitä resursseja tieteellisiin sovelluksiin, koulutuksessa, pelien kehityksessä ja visualisoinnissa. Niillä on myös keskeinen rooli numeerisessa simuloinnissa.

Algoritmilla luodut satunnaisluvut ovat pseudo-satunnaisia lukuja. Ne kuuluvat (suureen) joukkoon toistuvia numeroita, jonka sekvenssi on mahdotonta tai ainakin vaikeaa ennustaa. Toisin Delphi, joka käyttää lineaarista congruential generaattoria niin Free Pascal käyttää MersenneTwister algoritmia sen vakio [random](<http://lazarus-ccr.sourceforge.net/docs/rtl/system/random.html> "doc:rtl/system/random.html") toimintaan joka on määritelty RTL:ssä. Ennen ensimmäistä käyttöä, FPC: n satunnaislukugeneraattori on alustettava yhdellä [randomize](<http://lazarus-ccr.sourceforge.net/docs/rtl/system/randomize.html> "doc:rtl/system/randomize.html") funktiokutsulla, joka asettaa siemengeneraattorin. Tämä tehdään ohjelman käynnistysvaiheessa.

Vaihtoehtoisesti Unix- ja Linux-pohjaisissa järjestelmissä on virtuaaliset laitteet [[Dev random|/dev/random]] ja /dev/urandom ovat käytettävissä. Ne tuottavat (pseudo) satunnaislukuja perustuen laitteistoon.

Kolmas vaihtoehto on käyttää satunnaislukuja ulkoisista lähteistä, joko siihen erikoistuneista laitteista tai julkisista lähteistä, esimerkiksi perustuen radioaktiivisen hajoamisen tietoihin.

Tasainen jakauma

Jatkuvan tasaisen jakauman satunnaisluvut(kutsutaan myös uniform distribution ja rectangular distribution) edustaa symmetrisen jakauman perhettä. Tässä jokaisen satunnaisluvun esiintyminen on koko alueella ovat yhtä todennäköisiä kuin jonkun muun.

Vakio RTL:n funktio [random](<http://lazarus-ccr.sourceforge.net/docs/rtl/system/random.html> "doc:rtl/system/random.html") generoi satunnaislukuja, jotka täyttävät tasaisen satunnaislukujen jakautumisen. Jos sitä on kutsuttu ilman parametria niin random tarjoaa pseudosatunnaisen liukuluvun väliltä 0..1, eli 0 <= result <1. Jos random kutsutaan longint parametrillä L se antaa longint-tyyppisen satunnaisen kokonaisluvun välillä 0.. (L-1) .

Tasaisesti jakautunut satunnaisluvut eivät ole käyttökelpoisia kaikkiin käyttökohteisiin. Jotta saadaan satunnaislukuja muilla jakaumilla ovat erikoisalgoritmit ovat tarpeen:

Normaali (Gaussian) jakauma

Yksi yleisempiä algoritmeja tuottaa normaali Gaussin jakauman satunnaislukuja, tasaisen jakautuman satunnaisluvuista on Box-Müller lähestymistapa . Seuraava funktio laskee normaalin Gauss-jakauman satunnaislukuja:

pascal
function rnorm (mean, sd: real): real;
     {Laskee normaalin Gaussin satunnaislukuja Box-Müller lähestymistavan  mukaisesti}
      var
       u1, u2: real;
     begin
       u1 := random;
       u2 := random;
       rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);
      end;

Samaa algoritmia käyttää funktio randg RTL:n math käännösyksikössä:

pascal
function randg(mean,stddev: float): float;

Eksponentiaalinen jakauma

Eksponentiaalinen jakauma esiintyy usein reaalimaailman ongelmissa. Klassinen esimerkki on jakauma odotusaikojen välillä riippumattomien Poisson-satunnaisia ​​tapahtumia, kuten radioaktiivinen ytimen hajoaminen [Press et al. 1989].

Seuraava toiminto tarjoaa yhden todellisen satunnaisluvun ulos eksponentiaalisen jakauman mukaisesti. Rate on käänteinen keskiarvo ja vakio RESOLUTION määrittää "karkeuuden" kun generoidaan satunnaisia numeroita.

pascal
function randomExp(a, rate: real): real;
    const
      RESOLUTION = 1000;
    var
      unif: real;
    begin
      if rate = 0 then
        randomExp := NaN
      else
      begin
        repeat
          unif := random(RESOLUTION) / RESOLUTION;
        until unif <> 0;
        randomExp := a - rate * ln(unif);
      end;
    end;

Gamma jakauma

Gamma jakauma on kaksi parametrinen ja kuuluu jatkuvan satunnaisen jakauman ryhmään. Se on yleistys sekä eksponentiaalijakaumasta että Erlang jakaumasta. Mahdollisia gammajakauman sovelluksia ovat mallintaminen ja simulointi jonot tai jonot ja vakuutusmatematiikka.

Seuraava funktio tarjoaa yhden todellisen gammajakauman satunnaisluvun. Jakauman muoto määritetään parametreillä a , b ja c. Funktio käyttää funktiota randomExp joka on edellä määritelty.

pascal
function randomGamma(a, b, c: real): real;
    const
      RESOLUTION = 1000;
      T = 4.5;
      D = 1 + ln(T);
    var
      unif: real;
      A2, B2, C2, Q, p, y: real;
      p1, p2, v, w, z: real;
      found: boolean;
    begin
      A2 := 1 / sqrt(2 * c - 1);
      B2 := c - ln(4);
      Q := c + 1 / A2;
      C2 := 1 + c / exp(1);
      found := False;
      if c < 1 then
      begin
        repeat
          repeat
            unif := random(RESOLUTION) / RESOLUTION;
          until unif > 0;
          p := C2 * unif;
          if p > 1 then
          begin
            repeat
              unif := random(RESOLUTION) / RESOLUTION;
            until unif > 0;
            y := -ln((C2 - p) / c);
            if unif <= power(y, c - 1) then
            begin
              randomGamma := a + b * y;
              found := True;
            end;
          end
          else
          begin
            y := power(p, 1 / c);
            if unif <= exp(-y) then
            begin
              randomGamma := a + b * y;
              found := True;
            end;
          end;
        until found;
      end
      else if c = 1 then
        { Gamma jakauma muuttuu eksponenttijakaumaksi, jos c = 1}
      begin
        randomGamma := randomExp(a, b);
      end
      else
      begin
        repeat
          repeat
            p1 := random(RESOLUTION) / RESOLUTION;
          until p1 > 0;
          repeat
            p2 := random(RESOLUTION) / RESOLUTION;
          until p2 > 0;
          v := A2 * ln(p1 / (1 - p1));
          y := c * exp(v);
          z := p1 * p1 * p2;
          w := B2 + Q * v - y;
          if (w + D - T * z >= 0) or (w >= ln(z)) then
          begin
            randomGamma := a + b * y;
            found := True;
          end;
        until found;
      end;
    end;

Erlang jakauma

Erlang jakauma on kaksi parametrinen ja kuuluu jatkuvan satunnaisen jakauman ryhmään. Se on yleistys eksponentiaalijakaumasta ja erikoistapaus gammajakaumasta, missä c on kokonaisluku. Erlang jakauman on ensin kuvannut Agner Krarup Erlang jolla mallintaa puhelimen soittojen välistä aikaa. Sitä käytetään jonoteoriassa ja simuloidaan jonoja.

pascal
function randomErlang(mean: real; k: integer): real;
      const
        RESOLUTION = 1000;
      var
        i: integer;
        unif, prod: real;
      begin
        if (mean <= 0) or (k < 1) then
          randomErlang := NaN
        else
        begin
          prod := 1;
          for i := 1 to k do
          begin
            repeat
              unif := random(RESOLUTION) / RESOLUTION;
            until unif <> 0;
            prod := prod * unif;
          end;
          randomErlang := -mean * ln(prod);
        end;
      end;

Poissonin jakauma

Poissonin jakauman koskee kokonaislukuja. Se edustaa k onnistumisen todennäköisyyttä, kun todennäköisyyden menestys kussakin kokeessa on pieni ja esiintymistiheys (keskiarvo) on vakio.

pascal
function randomPoisson(mean: integer): integer;
    { Generaatori Poissonin jakaumalle (Donald Knuth algoritmi) }
    const
      RESOLUTION = 1000;
    var
      k: integer;
      b, l: real;
    begin
      assert(mean > 0, 'mean < 1');
      k := 0;
      b := 1;
      l := exp(-mean);
      while b > l do
      begin
        k := k + 1;
        b := b * random(RESOLUTION) / RESOLUTION;
      end;
      randomPoisson := k - 1;
    end;

Studentin t-jakauma

T-jakauma jota kutsutaan myös Studentin t-jakaumaksi, koska se julkaisi William Sealy Gosset vuonna 1908 salanimellä Student on jatkuva todennäköisyysjakauma. Sen muoto on määritelty yhdellä parametrilla, vapausasteella (df , degrees of freedom ). Tilastoissa monet estimaattorit ovat t-jakaumassa. Siksi Studentin t-jakauma on merkittävä rooli useissa laajalti käytetyissä tilastolliseissa analyyseissä, kuten Studentin t-testissä jossa arvioidaan tilastollista merkitystä kahden näytteen eron avulla, rakentaminen luottamusväli ero kahden populaation keskiarvojen ja lineaarista regressioanalyysiä. T-jakauma syntyy myös Bayesin kaavan tietojen analysointi normaalista.

Seuraava algoritmi riippuu RTL:n funktiosta [random](<http://lazarus-ccr.sourceforge.net/docs/rtl/system/random.html> "doc:rtl/system/random.html") ja randomChisq funktiosta

pascal
function randomT(df: integer): real;
    { Generaattori Student's t jakaumalle }
    begin
      if df < 1 then randomT := NaN
      else
      begin
        randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
      end;
    end;

Khii toiseen -jakauma

Khii toiseen -jakauma on jatkuva jakauma satunnaislukujen kanssa df vapausasteen. Se kuvaa riippumattomien normaalijakautuneiden muuttujien neliöiden summan käyttäytymistä Se on jakelu summa neliöiden DF riippumattoman standardin normaalia satunnaismuuttujia. is a continuous distribution of random numbers with df degrees of freedom. It is the distribution of a sum of the squares of df independent standard normal random variables. Khii toiseen -jakaumalla on lukuisia sovelluksia johdettu tilastoihin, esimerkiksi arvioitaessa varianssien ja khii toiseen testejä. Se on erikoistapaus Gamma jakaumasta jossa c = df / 2 ja b = 2. Siksi seuraava funktio riippuu funktiosta randomGamma.

pascal
function randomChisq(df: integer): real;
    begin
      if df < 1 then randomChisq := NaN
      else
      randomChisq := randomGamma(0, 2, 0.5 * df);
    end;

F-jakauma

F-jakauman, jota kutsutaan myös Fisher-Snedecor jakaumaksi, on jatkuva todennäköisyysjakauma. Sitä käytetään F-testissä ja ANOVA:ssa (Analysis of variance). Siinä on kaksi vapausastetta, jotka toimivat muotoparametreilla v ja w ja ne ovat positiivisia kokonaislukuja. Seuraava funktio randomF käyttää funktiota randomChisq.

pascal
function randomF(v, w: integer): real;
    begin
      if (v < 1) or (w < 1) then
        randomF := NaN
      else
      randomF := randomChisq(v) / v / (randomChisq(w) / w);
    end;

Katso myös

Viitteet

  1. G. E. P. Box and Mervin E. Muller, A Note on the Generation of Random Normal Deviates , The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610–611
  2. Dietrich, J. W. (2002). Der Hypophysen-Schilddrüsen-Regelkreis. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.
  3. Press, W. H., B. P. Flannery, S. A. Teukolsky, W. T. Vetterling (1989). Numerical Recipes in Pascal. The Art of Scientific Computing, Cambridge University Press, ISBN 0-521-37516-9.
  4. Richard Saucier, Computer Generation of Statistical Distributions, ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.
  5. R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, DOI 10.1007/978-1-4471-2993-6_2, © Springer-Verlag London Limited 2012
  6. Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007

From the Free Pascal wiki, page "Generating Random Numbers/fi", as the Internet Archive kept it on 2022-08-09. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.