_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/srand - užstatyti atsitiktinių skaičių generatorių

  • srand EXPR
  • srand

    Užstato atsitiktinį skaičių rand operatoriui.

    Funkcijos esmė yra "užtaisyti" rand funkciją taip, kad rand pateiktų rezultate kas kart skirtingą seką paleidus programą.

    Jei srand() nėra iškviečiamas tiesiogiai, tuomet jis iškviečiamas netiesiogiai pirmąkart panaudojus rand operatorių. Visgi, taip nebuvo iki Perl 5.004, taigi, jei skriptas bus paleidinėjamas senesnėse Perl versijose, jis turėtų išsikviesti srand.

    Dauguma programų net neiškvies srand() visiškai, išskyrus tas, kurioms reikia kriptografiškai stipraus pradinio taško, o ne bendrai priimto, esančio pagal nutylėjimą, kuris paremtas dienos laiku, proceso ID ir vietos atmintyje arba /dev/urandom priemonės, jei ji galima.

    Galima iškviesti srand($seed) su tuo pačiu $seed kad atstatyti tą pačią seką iš rand(), bet tai dažniausiai skirta nuspėjamų rezultatų generavimui testavimo reikmėms arba debuginimui. Kita vertus, srand() nereikėtų iškvietinėt daugiau nei kartą programoje.

    Neiškvietinėti srand() (be argumentų) daugiau nei kartą skripte. Atsitiktinių skaičių generatoriaus ypatybės yra entropiškesnės nei gali būti suteikta vis iškvietinėjant srand(), taigi iš tikrųjų prarandamas atsitiktinumas pakartotinai kviečiant srand().

    Daugiausiasrand realizacijų paima sveikąjį skaičių ir tyliai "apkapoja" dešimtainius skaičius. T.y. srand(42) rezultatai greičiausia bus tokie patys kaip ir srand(42.1). Pasisaugoti, visada reiktų perduoti srand sveikąjį skaičių.

    Perl versijose iki 5.004 pagal nutylėjimą perduodamas duomuo būdavo dabartinis laikas (time). Tai nėra ypatingai geras "užtaisas" duomenų "randomizavimui", tad daug senesnių programų perduoda tiesiog savo sugeneruotą reikšmę (dažnai time ^ $$ ar time ^ ($$ + ($$ << 15)) ), bet tai daugiau nebėra būtina.

    Pažymėtina, akd kriptografinėms reikmėms reikėtų kažko kur kas labiau atsitiktinio nei pagal nutylėjimą perduodami duomenys. Sukompresuoto išvedimo vienos ar daugiau greit besikeičiančių operacinės sistemos statuso programų čeksuminimas yra įprastinis metodas. Pavyzdžiui:

        srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`);

    Jei būtent tuo domimasi, reiktų paskaityti Math::TrulyRandom modulį CPAN.

    Dažnai iškviečiamos programos (kad ir CGI scriptai), kurie paprasčiausiai naudoja

        time ^ $$

    gali tapti lengvu grobiu matematinei savybei, jog

        a^b == (a+1)^(b+1)

    trečdalį laiko. Tad nedarykite to.

algirdas@perl.lt 2005.04.11 - $dabar