Su šventėmis!

Gruodžio 26, 2011

Su šventėmis!Gal kiek ir pavėluotas pasveikinimas, visgi jau Kūčios ir pusė Kalėdų kaip ir pasibaigė, tačiau geriau dabar negu niekad, ar ne?

Taigi, sveikinu visus savo tinklaraščio skaitytojus su ilgai lauktomis 2011-ųjų metų žiemos (nors ir be sniego) šventėmis – Kūčiomis, Kalėdomis bei, savaime aišku, Naujausiais Metais! Linkiu smagiai pradėti naujuosius 2012 metus, taip pat smagiai ir užbaigti – reikia juk gerai pasilinksminti prieš tą “pasaulio pabaigą”, ar ne? :) Linkiu patirti kažką įdomaus, ką galėtumėte atsiminti visą gyvenimą, taip pat sužinoti kažką naujo, kas tolimesniame gyvenimo kelyje Jums padėtų, linkiu tokių 2012-ųjų metų, kad nereiktų metų gale galvoti, kad taip nieko gero per visus metus ir nenuveikėte.

Linkiu gražių Kalėdų bei linksmų ir turiningų Naujųjų Metų visiems mano tinklaraščio skaitytojams!

0

Kaip dvejetą pastatyti per vidurį, vienetą – priekyje, o trejetą – gale? Rikiavimo algoritmai.

Gruodžio 21, 2011

Ilgokai jau čia nerašiau. Kodėl? Pirma, tai dėl to, nes nelabai turėjau laiko visą mėnesį, antra, nes paprasčiausiai neturėjau idėjų, apie ką galėčiau parašyti. Tarp kitko, atsiprašau už tai, kad lapkričio 16-17 dienomis kažkuriuo metu tinklaraštis nebuvo pasiekiamas – EuroVPS perkėlė mane į kitą serverį, pažadėjo geresnę kokybę – žiūrėsim, kaip čia bus. :)

Taigi, prie reikalo: turbūt visi pastebi, kad informacija kažkokiose programose, internetiniuose puslapiuose dažnai būna surikiuota tarkim pagal datą, abėcėlę, skaičių eilės tvarką ar pan. Kaip programuotojai sugeba surikiuoti (surūšiuoti) duomenis eilės tvarka? Na, tam yra keletas algoritmų, dažniau naudojamus čia ir pamėginsiu apžvelgti.

Pirmas ir vienas iš paprasčiausių rikiavimo algoritmų yra vadinamas „Selection sort“ (išrinkimo algoritmas). Algoritmo veikimo principas labai paprastas: visas duomenų masyvas yra „skenuojamas“ ir ieškoma pačio mažiausio elemento, tada tas elementas yra nukeliamas į masyvo pradžią (jeigu reikia, kad duomenys būtų surikiuoti nuo mažiausio iki didžiausio). Vėliau ciklas kartojamas, tik šįkart netikrinant pirmojo masyvo elemento. Iš krūvos likusių elementų yra išrenkamas mažiausias ir jis jau yra statomas į antrąją masyvo vietą. Vieno ciklo („skenavimo“) metu gali būti perkeliamas tik vienas elementas, todėl šis algoritmas yra ganėtinai lėtas, jeigu duomenų kiekiai yra dideli. Manau iš iliustracijos suprasti bus šiek tiek lengviau.

Šis metodas vėliau buvo patobulintas ir pavadintas „Double selection sort“ (dvigubo išrinkimo algoritmas). Šio metodo principas yra lygiai tas pat, tik „skenuojant“ masyvą yra ieškoma ne tik mažiausių elementų, bet ir didžiausių ir vėliau mažiausias elementas nukeliamas į masyvo pradžią, didžiausias – į pabaigą. Vėliau procesas kartojamas, tik į jį neįtraukiamas pirmasis ir paskutinis masyvo elementai. Toks mažytis patobulinimas leido šį algoritmą pagreitinti du kartus. Internete neradau geros iliustracijos pavaizdavimui, tačiau manau nėra sunku įsivaizduot tokį procesą, jeigu pilnai supratote „Selection sort“.

Trečias metodas, apie kurį noriu papasakoti yra „Insertion sort“ (įterpimo algoritmas). Šis algoritmas nėra labai dažnai sutinkamas ir aš pats jo beveik niekad nenaudoju, tačiau jo veikimo principas nėra labai sunkiai suprantamas. Šio metodo metu masyvas yra suskaidomas į dvi dalis – surūšiuotąją dalį ir nesurūšiuotą dalį. Surūšiuota masyvo dalis būna masyvo pradžioje, nesurūšiuota – pabaigoje. Kiekvienos iteracijos (ciklo) metu, imamas vienas iš nesurūšiuotos dalies elementų (paprastai visi elementai imami paeiliui) ir to elemento reikšmė yra išsaugoma kintamajame ir iš masyvo ištrinama (paliekama tuščia vieta). Vėliau tikrinama, į kurią surūšiuotos masyvo vietos dalį tas elementas turėtų tikti, t.y. jeigu prieš tai buvęs elementas yra mažesnis už pasirinktąjį, o kitas yra didesnis, reiškia šioje vietoje reikia įterpti tą elementą. Pvz. turime surūšiuotą masyvo dalį [1][3][4][5] ir turime elementą [2], pradedame nuo surūšiuoto masyvo galo tikrinti, kur tas [2] turėtų tikti – pirma tikriname [4][5], kadangi [4] yra didesnis už [2], tai jo vieta yra ne čia. Vėliau tikriname [3][4], kadangi, vėlgi, [3] yra daugiau nei [2], čia šis elementas netinka, tęsiame procesą su [1][3]. Kadangi 1 yra mažiau už [2] ir [3] yra daugiau už [2], tai šioje vietoje reikia įterpti šį elementą. Elementas [2] yra įterpiamas į antrą masyvo poziciją, tuo tarpu [3][4][5] yra perstumiami viena pozicija toliau. Nemoku puikiai paaiškinti šių dalykų teksto forma, todėl iš iliustracijos manau susigaudyti bus daug paprasčiau.

Ketvirtas, šiek tiek primenantis „Insertion sort“ (bent man) yra vadinamas „Bubble sort“ (Burbulo algoritmas). Šį algoritmą suprast ir sugebėt pritaikyt turėtų mokėt kiekvienas pradedantis programuotojas. Suprast šį metodą yra labai nesunku, sudėtingiau šiek tiek yra jį panaudoti praktikoje. Burbulo algoritmas yra pakankamai lėtas, tačiau jo pagrindinis privalumas yra tas, kad jis nenaudoja kompiuterio atminties – nereikia nustatyti jokių papildomų kintamųjų, užtenka turėt tik patį masyvą. Veikimo principas yra toks: pradedama yra nuo masyvo pabaigos, yra imami du masyvo elementai ir jie kartu yra lyginami. Jeigu antrasis elementas yra mažesnis už pirmąjį – jie yra apkeičiami vietomis ir mažesnis elementas pakliūva arčiau masyvo pradžios. Po šio apkeitimo yra imami kiti du elementai (priešpaskutinis masyvo elementas ir elementas, esantis jam iš kairės) ir jie identiškai yra tikrinami – jeigu antrasis elementas yra mažesnis už pirmąjį – jie yra apkeičiami vietomis, jeigu visgi antrasis elementas yra didesnis už pirmąjį nedaroma nieko ir pereinama prie kitų dviejų elementų. Pavyzdys: tarkim turime masyvą iš trijų elementų [4][1][3]. Pirma paimame du paskutinius masyvo elementus [1] ir [3]. Kadangi [1] yra mažesnis už [3], nieko su jais nedarome. Einame prie kitų dviejų elementų – [4] ir [1]. Kadangi kairysis elementas ([4]) yra didesnis už dešinįjį, apkeičiame juos vietomis ir gauname masyvą [1][4][3]. Baigėsi viena ciklo iteracija. Vėl visą procesą kartojame iš naujo – tikriname paskutinius du elementus [4][3], kadangi [4] daugiau už [3], apkeičiame juos vietomis, vėliau imant [1][3] nereikės nieko keisti vietomis. Galiausiai turime surikiuotą masyvą – [1][3][4]. Iliustracijoje pavaizduotas tas pat algoritmas tikrinant masyvą nuo jo pradžios. Praktiškai nėra jokio skirtumo, ar masyvas bus pradėtas rūšiuoti nuo pradžios, ar nuo pabaigos. Jeigu bus pradedama rūšiuoti nuo pradžios, pirmiausia bus surūšiuoti didžiausi masyvo elementai, jeigu bus pradedama rūšiuoti nuo pabaigos – pirmiausia bus surūšiuojami mažiausi masyvo elementai.

Na ir paskutinis, kurį aptarsiu šiame straipsnyje, yra „Quicksort“ algoritmas. Lietuviškai jis skambėtų kaip „greitojo rikiavimo algoritmas“, tačiau retai jis taip vadinamas. Tai vienas iš greičiausių ir plačiausiai naudojamų algoritmų. Mano aukščiau minėti algoritmai visi turėjo vieną pagrindinę neigiamą savybę – jie veikia pernelyg lėtai, kai masyvas yra didelis (rikiuojama labai daug duomenų), tuo tarpu „Quicksort“ lengviau tvarkosi su didesniais duomenų kiekiais negu su mažesniais. Būtent dėl šios priežasties šis algoritmas yra plačiai paplitęs. „Quicksort“ veikimo principas yra toks: pirma yra paimamas vienas iš masyvo elementų (geriausia, kad tas elementas būtų mediana, tačiau praktikoje tai neefektyvu, nes tam reikia skenuot visą masyvą ir tokiu būdu nustatyti medianą). Vėliau visas masyvas yra suskaidomas yra dvi dalis – pirmojoje dalyje yra visi masyvo elementai, kurie yra didesni už paimtą skaičių, antroje – mažesni. Tas skaičius, kuris buvo paimtas, yra vadinamas „Pivot“ ir po šio perrinkimo galime garantuoti, kad šis skaičius tikrai yra savoje vietoje. Vėliau šis procesas kartojamas paėmus jau kitą „pivot“ skaičių vienoje iš likusių dviejų masyvo dalių. Realiai, tokiu būdu masyvas yra suskaidomas į kelias dalis, kurios vėliau rūšiuojamos atskirai. Šio dalyko pliusas yra tas, kad kai kuriais atvejais vienos iteracijos metu gali būti surūšiuojami keli elementai, tuo tarpu visuose ankstesniuose algoritmuose per vieną iteraciją savo vietą masyve atrasdavo tik vienas elementas. Tai „Quicksort‘ui“ leidžia didelius masyvus surūšiuoti daug greičiau. Šio rūšiavimo pavyzdys: tarkime turime masyvą [1][5][9][3][7][8][4], paimame vieną atsitiktinį „pivot“ skaičių, tarkime tas skaičius yra [5], tada visus mažesnius elementus stumiame į kairę, didesnius  – į dešinę pusę ir gauname tokį masyvą: [1][3][4][5][9][7][8], po šio perrikiavimo [5] dabar tikrai yra savoje vietoje. Dabar imame bet kurį atsiktinį skaičių iš „mažesniojo“ masyvo, tarkime tai bus [1], po perrikiavimo gauname tokį masyvą – [1][3][4][5][9][7][8], [1] dabar tikrai yra savo vietoje. Dabar imame vieną iš likusių dviejų skaičių [3] arba [4] atsitiktinai ir po patikrinimo gausime [1][3][4][5][9][7][8]. Kaip matome per tris iteracijas sugebėjome surikiuoti keturis elementus. Dabar lieka kitas, mažesnis masyvas – tarkime atsitiktinai išrenkamas skaičius [8], tai po šios iteracijos visas masyvas bus surikiuotas – [1][3][4][5][7][8][9]. Kadangi po perrinkimo tarpuose liko po vieną skaičių – [7] ir [9], tai tų skaičių nėra su kuo lyginti, o tai reiškia, kad jie tikrai yra savose vietose. Kaip matome, užteko vos 4-ių iteracijų, kad surikiuotume 7-ių elementų masyvą!

Kurį metodą kada naudoti? Na, tai priklauso nuo turimo masyvo dydžio ir nuo to, kokie duomenys jame saugomi. Realiai didelio skirtumo tarp visų šių metodų nėra, jeigu masyvas yra nedidelis (tarkim iki 500 elementų), kai kuriais atvejais, dirbant su nedideliais masyvais, koks įterpimo algoritmas surikiuoja duomenis greičiau negu „Quicksort‘as“. Kalbant apie masyvus, kuriuose yra saugomi kažkokie ilgi teksto blokai ir elementų kiekis nėra didelis, naudinga būtų naudoti „Bubble sort“ metodą dėl to, nes jis nenaudoja operatyviosios atminties (nereikia kelti didelių duomenų į RAM, vėliau atlaisvinti RAM ir vėl kelti naujus, kas gali kainuoti kelias milisekundes). Kalbant apie didelius masyvus, kuriuose yra tūkstančiai elementų, aiškus lyderis čia yra „Quicksort“ dėl savo galimybės greitai dirbti su dideliais masyvais. Na, aišku, jeigu turite milijonus ar milijardus nerūšiuotų elementų, tokiu atveju net ir „Quicksort“ darbuosis ilgą laiką.

Pabaigai dar norėčiau pridurti, kad pradinėje straipsnio versijoje buvau įdėjęs ir kodo pavyzdžių, tačiau pamačiau, kad juos įdėjus straipsnio apimtys beveik padvigubėja (o jis ir taip nėra trumpas), tuo tarpu įvedus į „Google“ ar „Bing“ vien algoritmo pavadinimą, yra labai nesunku rasti bent keletą kodo pavyzdžių (paprastai pirmajame, dažniausiai „Wikipedijos“, rezultate jau būna pateikta bent pora kodo pavyzdžių – C++ ir Pascal kalbomis). Taip pat pranešu, kad laikinai išjungiau komentavimo tinklaraštyje galimybę, nes užpuolė šiandien spambotai – daugiau negu 1000 komentarų teko šiandien ištrinti. Kai tik surasiu sprendimą, kaip atsikratyti šių viagros pardavėjų, iškart vėl įjungsiu komentavimo galimybę. Jeigu kas nors žinote, kaip būtų galima tai sutvarkyti, būčiau dėkingas jei praneštumėte apie tai, mano kontaktus galima rasti “Kontaktai” skiltyje. Dėkoju ir atsiprašau už nepatogumus.

1

“Occupy Wall Street”: ar protestas pasmerktas žlugimui?

Spalio 22, 2011

Turbūt dauguma, kurie kažkiek domisi politika ir ekonomika, jau girdėjote apie „Occupy Wall Street“ protestus. Tiems, kas negirdėjo: tai protestas vykstantis Jungtinėse Valstijose prie Niujorko akcijų biržos, kuriame žmonės protestuoja prieš didelį nedarbą, lėtą ekonomikos atsigavimą ir mažą valdžios dėmesį jiems, tuo tarpu finansinę paramą ir pagalbą didžiosioms kompanijoms, bankams bei korporacijoms. Šią idėją nusikopijavo ir Europos „antikapitalistai“, surengę kelis mitingus Europos valstybėse (kai kur netgi nelabai taikius – Romoje įvyko riaušės). Taigi, kelių JAV gyventojų idėja tapo pasauliniu protestu.

Nors ir domėjausi pačia protesto idėja JAV, „Occupy Wall Street“ tikslų pilnai perprasti nesugebėjau. Kaip patys protesto organizatoriai teigia, pagrindinis tikslas yra priverst valdžią atsižvelgti į žmones, o ne tenkinti tik didžiųjų kompanijų ir bankų interesus, tačiau, kokiu būdu tai būtų galima padaryti, nepasakoma. Netgi iš nuomonių ir komentarų galima susidaryt nuomonę, kad žmonės tiesiog nori to, kad Federalinis Rezervų Bankas paimtų ir prispausdintų pinigų ir tiesiogiai juos išdalintų žmonėms vietoje to, kad skolintų bankams, taip pat, kad didžiosioms kompanijoms nebūtų skiriama parama, tuo tarpu būtų tie pinigai investuojami „į gyventojus“. Tam, kas nusimano ekonomikoje, idėjos turėtų iškart skambėti absurdiškai – pirmuoju variantu šalyje pradėtų kilti infliacija, antruoju – įvyktų bankrotų banga, abiem atvejais „paprasti žmonės“ nieko neišloštų.

Kodėl pirmuoju atveju turėtų pradėti kilti infliacija? Infliacija yra bendras prekių ir paslaugų kainų kilimas. Pvz. jeigu metinė šalies infliacija yra 8%, kokia buvo Lietuvoje 2007-aisias metais (Statistikos departamento duomenys), tai reiškia, kad po metų tos pačios prekės bus pabrangę maždaug 8%. Kad geriau suprastumėte, kodėl infliacija minėtuoju atveju turėtų augti, įsivaizduokite save kaip verslininką, kuris tarkim pardavinėja pliušinius meškiukus už $20. Jeigu dabar susidaro tokia situacija, kad Federalinis Rezervų Bankas (toliau trumpinsiu FED) prispausdina dolerių ir visus juos išdalina gyventojams, tai greičiausiai Jūsų pliušinių meškiukų paklausa turėtų pakilti, ar ne? Taigi, kodėl Jums tokiu atveju tiesiog nepakėlus pliušinių meškiukų kainos? Jeigu žmonės turi daug pinigų, jie vis tiek juos pirks pakankamai dažnai ir paklausa sumažės nežymiai, tuo tarpu Jūsų pajamos gali stipriai išaugti. Tokia pat logika vadovaujasi visi pardavėjai, todėl, jeigu rinkoje yra per daug pinigų, prekių ir paslaugų kainos pradeda kilti (vyksta infliacija). Tokiu atveju gyventojai neišlošia, nors vizualiai ir turi daugiau pinigų, valiuta paprasčiausiai nuvertėja ir viskas grįžta į senas vėžias.

Kodėl antruoju atveju turėtų įvykti bankrotų banga? Vėlgi, paprašysiu įsivaizduoti Jus kaip verslininką, kuris pardavinėja tuos pačius meškiukus. Tarkime Jūs esate skolingas bankui 100 tūkstančių dolerių ir staiga įvyksta ekonominė krizė – meškiukų paklausa stipriai krinta, todėl Jūsų pajamos labai sumažėja, Jūs turite atleisti darbuotojus, stengiatės įmonės viduje taupyti, tačiau Jums reikia mokėti įmokas bankui (juk esate skolingas). Kadangi meškiukų paklausa nukrenta iki labai žemų lygių, Jūs paprasčiausiai nesurenkate tiek pinigų, kad galėtumėte sėkmingai mokėti įmokas bankui. Prisiminkime, kad bankas taip pat nuo krizės nukenčia – įmonės bankrutuoja, nekilnojamojo turto kainos krinta (dėl ko skolos, kurių metu kaip užstatas buvo duotas nekilnojamas turtas labai nuvertėja) ir pan., taigi jis Jus spaudžia mokėti įmokas. Kadangi Jūs to atlikti negalite, paskelbiate įmonės bankrotą. Tokiu atveju bankas perima visą Jūsų turtą, tačiau, kadangi jo vertė yra stipriai nukritus, bankas nesugeba turto parduoti, todėl jis pinigų nebeatgauna, tuo tarpu finansinių įsipareigojimų jam lieka nemažai. Turto neatgavimas galiausiai nuvaro ir banką į bankrotą ir toliau vyksta tokia grandininė reakcija, nes įmonės, ypač didžiosios, neretai yra priklausomos viena nuo kitos ir vienos kritimas reiškia, kad kitos nukenčia taip pat. Bankrutavusių įmonių darbuotojai tokiu atveju, savaime aišku, lieka be darbo. Taigi, sprendimo būdas tiesiog nekreipti dėmesio į didžiųjų kompanijų finansines problemas gali reikšti labai didelį nedarbo padidėjimą. O iš nedarbo visuomenė naudos kažin ar gaus (nebent tik tuo, kad atsiveria nišų smulkiems verslininkams).

Taigi, kokia protesto ateitis? Greičiausiai jokios, ateis žiema ir protestuotojai „išsilakstys“, galiausiai praeis dar metai, ekonomika atsigaus ir vėl visi skanduos „Kapitalizmas jėga“. Tikimybė, kad tie žmonės galėtų įvesti kažkokia ekonominę revoliuciją yra nulinė, nes patys protestuotojai paprasčiausiai neturi jokių idėjų, kurios galėtų pakeisti kapitalizmą. Aš, kaip laisvosios rinkos šalininkas, tikiuosi, kad kapitalizmo artimiausiu metu niekas nepakeis.

Panašią protesto pabaigą įsivaizduoja ir „Wall Street Journal“ žurnalistas Brett Arends. Jo straipsnį ir argumentus galima rasti MarketWatch tinklalapyje.

0

Atsitiktiniai skaičiai: kokie jie yra ir kaip jie gaunami?

Spalio 7, 2011

Programuojant labai dažnai tenka susidurti su atvejais, kada prireikia sugeneruoti kokį nors atsitiktinį skaičių ar simbolį. Pvz. sukūrus „monetos metimo“ loteriją, juk realiai niekas ten jokios monetos nemėto, tiesiog kompiuteris sugeneruoja atsitiktinį skaičių (pvz. 0 ir 1) ir galiausiai vėliau išvedamas rezultatas iš to skaičiaus – tarkim, jeigu rezultatas yra 0, išvedamas rezultatas „Iškrito herbas“, o jeigu rezultatas yra 1, tai išvedamas rezultatas „Iškrito skaičius“. Visi žinome, kad kompiuteris yra visiškai logiška mašina, t.y. kompiuteris mums niekad neišves, kad 2+2 yra 5. Taigi, kokiu būdu logikai ir matematikai pavaldi mašina gali sukurti atsitiktinį skaičių?

Problema generuojant atsitiktinius skaičius atsirado vos atsiradus pirmiesiems mikroprocesoriams. Pirmiesiems programuotojams teko ilgokai pasukti galvas, kad sugalvotų, kaip daiktą, kuris visiškai paklūsta matematikai, priversti sugeneruoti atsitiktinį skaičių. Dabar programuotojams tame didelių problemų nekyla – praktiškai kiekviena programavimo kalba turi Random(); funkciją, kuri sugeneruoja tą skaičių ir visiškai nereikia galvoti apie kažkokias matematines formules, kurios skirtos tų skaičių generavimui. Neretas programuotojas (ypač pradedantysis) net nežino, kokiu būdu tie skaičiai yra sugeneruojami.

Atsitiktinių skaičių rūšys yra dvi – tikrieji atsitiktiniai skaičiai ir pseudo-atsitiktiniai skaičiai (pseudo-random). Tikrieji atsitiktiniai skaičiai yra sugeneruojami matuojant visiškai atsitiktinius procesus (branduolinį skilimą, atmosferinį triukšmą ir pan.). Tokiems skaičiams generuoti reikia papildomos įrangos, kaip pvz. Geiger–Müller kameros, kuri fiksuoja branduolinį skilimą ir naudojantis šia informacija galima sugeneruoti visiškai atsitiktinį skaičių. Pseudo-atsitiktinių skaičių generavimas yra loginis metodas, dažniausiai tai yra matematinė formulė. Paprastai tariant, į formulę įstatomas „seed“ ir iš to yra gaunama atsitiktinių skaičių seka. „Seed“ yra nežinomasis formulėje, tik jį pakeitus kažkokiu skaičiumi yra gaunamas atsakymas. Kiekvienąkart įvedus tą patį „seed“, visad gaunama lygiai tokia pati atsitiktinių skaičių seka. Pvz. jeigu įstatysime į formulę 5, visad gausime seką tarkim 147890154278…, taigi norint kaskart gauti vis skirtingą atsitiktinių skaičių seką, reikia, kad „seed“ pasikeistų. Tokiu atveju turbūt kyla klausimas, kokiu būdu kompiuteris gali parinkti atsitiktinį „seed“, kad seka kiekvieną kartą būtų visiškai atsitiktinė? Atsakymas paprastas – negali, todėl dažnai kaip „seed“ yra naudojama dabartinė sistemos data ir laikas unix išraiška. Unix išraiška reiškia sekundžių kiekį, kuris praėjo nuo 1970-ųjų metų sausio pirmos dienos.

Vienas iš pirmųjų pseudo-atsitiktinių skaičių generavimo būdų buvo John von Neumann 1946-aisiais išrastas metodas, vadinamas middle-square metodu. Metodas yra labai paprastas – tiesiog paimamas koks nors skaičius kaip „seed“, jis pakeliamas kvadratu ir viduriniai gauto rezultato skaičiai yra laikomi „atsitiktiniais“. Tuo tarpu, jei reikia sugeneruoti daugiau atsitiktinių skaičių, ankstesnis rezultatas yra panaudojamas, kaip seed, t.y. jis vėl pakeliamas kvadratu ir vėl imami gauto rezultato viduriniai skaičiai. Procesas kartojamas tiek kartų, kiek reikia. Šis metodas veikia tol, kol skaičių reikia labai nedaug, nes vėliau skaičiai gautoje sekoje pradeda kartotis. Pvz. paėmus nulį kaip pradinę reikšmę, skaičiai pradeda kartotis iškart ir gaunama reikšmė būna 0000… Šiuo metu yra rasta daug efektyvesnių pseudo-atsitiktinių skaičių generavimo būdų.

Kur yra naudojami pseudo-atsitiktiniai skaičiai ir kur geriau jų nenaudoti? Pseudo-atsitiktiniai skaičiai labai puikiai tinka statistikai, nes kiekvieno iš skaičių kritimo tikimybė yra lygiai tokia pati. T.y. nebus taip, kad sugeneravus 1 000 000 pseudo-atsitiktinių skaičių eilutę nuo 0 iki 1, gautame rezultate vienetas kartosis 95% kartų, o nulis – tik 5%. Gautame rezultate tikimybių nuokrypis nebus labai didelis, o bus „realus“, pvz 49% nulių ir 51% vienetų. Kadangi šis metodas yra grynai matematinis, visų skaičių tikimybės yra labai tikslios. Tačiau, nors vizualiai pseudo-atsitiktiniai skaičiai visiškai niekuo nesiskiria nuo realių atsitiktinių skaičių, šis metodas dažnai nėra naudojamas didelėse loterijose, kai kuriuose internetiniuose pokerio tinklalapiuose, nes teoriškai gali būti nuspėjamas. Tereikia žinot metodą, kuriuo naudojantis yra sugeneruojami skaičiai ir „seed“, kuris naudojamas (o tai dažnai būna, kaip minėjau, sistemos data ir laikas). Tiriant ilgą atsitiktinių skaičių eilutę gautą iš kokios nors virtualios ar realios loterijos, galima atspėti metodą ir nustatyti naudojamą „seed“, kaip neseniai padarė kanadietis statistikas Mohanas Srivastava, kuris pastebėjo tendencijas ir nustatė algoritmą loterijoje. Taigi, jeigu ruošiatės kurti kažkokią loteriją, geriau nenaudokite pseudo-atsitiktinių skaičių generatoriaus, nes Jūsų loterija gali būti paprasčiausiai „nulaužta“. :)

P.S. Žinau, kad gal kai kur mano rašymo stilius gali būti kiek per sudėtingas, todėl, jei kas nors neaišku – praneškite komentaruose. :)

3

Mob. telefonų draudimas mokyklose

Rugsėjo 27, 2011

Mobilusis telefonas – neatskiriamas XXI-ojo amžiaus žmogaus draugas. Turbūt daugelis dabar neįsivaizduotų gyvenimo be jų. Dabartiniai mobilieji telefonai yra skirti ne tik skambinimui ir žinučių rašymui, bet turi ir GPS, ir wi-fi internetą ir dar daugybę galimybių. Kadangi jų vartojimas tiek Lietuvoje, tiek visame pasaulyje tapo labai platus, tai natūralu, kad atsirado ir baimių dėl jo skleidžiamų elektromagnetinių bangų tariamos žalos. Taip pat prie gando “prikibo” ir mūsų Seimo nariai, užsimoję uždrausti naudotis mobiliaisiais telefonais mokyklose. Kiek tose baimėse yra tiesos ir kokią naudą ar žalą galėtų duoti šis draudimas?

Kadangi pats esu mokinys, tai mobiliųjų telefonų draudimas tiesiogiai paliestų ir mane. Negana to, beveik kiekvienas mokytojas dabar pasakoja “tuoj telefonai bus uždrausti, negalėsit sms’intis per pamokas” ir pan. Taip pat dažnas dabar pradeda teigt, kad mobilieji telefonai sukelia vėžį, nes juk jei yra planuojamas draudimas, tai turbūt tie įrodymai jau yra pakankamai tvirti? Mobiliųjų telefonų žalai patvirtinti buvo atlikta daugybė eksperimentų, skirta nemažai lėšų, tačiau ta žala nė karto nebuvo realiai patvirtinta, o kai kažkas neva patvirtindavo, jokia kita mokslinė laboratorija nesugebėdavo eksperimento atkartoti. Taip pat nelabai seniai PSO pranešė, kad mobilieji telefonai galimai sukelia vėžį, tačiau netgi PSO eksperimentiškai nesugebėjo rasti ryšio tarp vėžio ir mobiliųjų telefonų.

Tokios baimės iš dalies atsiranda ir dėl to, nes žmonės nelabai žino, kas yra elektromagnetinės bangos ir kaip jos veikia. Turbūt netgi ne kiekvienas žino, kad šviesa taip pat yra tam tikro dažnio elektromagnetinės bangos. Elektromagnetinis spektras yra suskirstytas į 7-ias dalis – gama spinduliuotė, Rentgeno spinduliuotė, ultravioletiniai spinduliai, regimoji šviesa, infraraudonieji spinduliai, mikrobangos ir radijo bangos. Gama spinduliuotė ir Rentgeno spinduliai gali jonizuoti atomus (jų energija didelė, todėl jie nesunkiai “išmuša” elektronus iš atomų, taip paversdami juos teigiamais jonais), ultravioletiniai spinduliai gali sukelti nudegimus, tačiau jų energija nėra tokia didelė, kad galėtų išmušti elektronus, infraraudonieji spinduliai perduoda šilumą (juos spinduliuoja kiekvienas daiktas, kurio temperatūra yra didesnė už absoliutųjį nulį), tuo tarpu mikrobangos ir radijo bangos neturi tiek energijos, kad darytų kažkokį poveikį. Tiesa, mikrobangų ruože esantis dažnis, kuris naudojamas mikrobangų krosnelėse, gali rezonuoti vandens ir riebalų molekules. T.y. medžiaga absorbuoja elektromagnetines bangas ir molekulės pradeda “virpėti”, o tai yra šiluminis procesas (kūno šiluma yra tiesiog vienetas, kuris nurodo, kokiu greičiu molekulės kūne virpa).

GSM mobiliojo telefono maksimali leidžiama spinduliuojamoji galia yra 1 vatas, 3G/UMTS telefono dvigubai didesnė – 2 vatai. Mobiliojo telefono spinduliuojamos elektromagnetinės bangos kūnus, kurie jas absorbuoja, šiek tiek kaitina. T.y. kalbant telefonu, smegenų absorbuojama elektromagnetinių bangų dalis virsta šiluma – molekulės temperatūra nežymiai pakyla, tačiau ta šiluma akimirksniu išsisklaido, nes jos kiekis yra tiesiog per mažas. Visas mikrobangų ruožas pasižymi didesniu ar mažesniu terminu poveikiu, tačiau mob. telefono spinduliuotė yra ne tik tokia maža, kad šiluminis poveikis yra nejuntamas, tačiau ir dažnis nėra toks, kuris galėtų sukelti kažkokios smegenyse esančios medžiagos rezonansą. Taigi, kokiu būdu mobiliųjų telefonų skleidžiama spinduliuotė gali sukelti vėžinius susirgimus?

Antrasis Seimo narių pateiktas argumentas buvo mokinių drausmė. Šioje vietoje negaliu su jais nesutikti – tikrai labai daug mokinių naudojasi mobiliaisiais telefonais, kada tam visiškai nėra būtinybės, ir dėl to prastai išgirsta pamoką. Tačiau kodėl dėl kelių mokinių veiksmų turi kentėt kiti, kuriems mobilusis telefonas galbūt reikalingas tik itin svarbiems reikalams? Galų gale, dabar yra XXI amžius, tėvai visad nori palaikyt ryšį su savo vaikais. Kas paprastai būna, jei vaikas negrįžta reikiamu metu? Paprastai tėvai jam tiesiog paskambina ir paklausia, kur jis yra. Bet jeigu vaikas telefono neturės, tėvai gali pradėt bereikalingai jaudintis. Taip pat būna ir labai rimtų situacijų, kada mokiniui reikia išeiti viduryje pamokos dėl kažkokio rimto dalyko. Panašią situaciją teko ir pačiam matyti – klasioko močiutė numirė ir jis turėjo išeiti iš pamokos. Kaip būtų tėvai susisiekę su juo, jeigu ne mobilusis telefonas? Aišku, suprantu, kad dauguma pagalvos, kad tikimybė, kad taip nutiks kokiam nors mokiniui yra 1/1000 ar dar mažesnė, tačiau čia mes kalbame ne apie vieną mokinį kažkokį, bet apie draudimą visos Lietuvos mastu – apie visus mokinius.

Aišku, be telefonų išgyventi galima ir žmonės anksčiau be jų puikiai versdavosi, tačiau tą patį galima pasakyti ir apie buitinę techniką, elektrą, automobilius ar pan. Kažkada viso to nebuvo, tačiau “žmonės vis tiek puikiai versdavosi”. Laikai keičiasi, vyksta progresas ir mano manymu jo nederėtų stabdyti. Kažkokios priemonės prieš tuos, kurie be saiko naudojasi telefonais mokyklose, turi būti naudojamos, bet visuotinis draudimas ne išeitis. Mobilieji telefonai, jeigu ir sukelia vėžį, greičiausiai išgelbėjo daugiau gyvybių negu pražudė – kai gatvėje pamatai sunkiai sužeistą, sumuštą žmogų, išsitrauki savo išmanųjį telefoną ir puoli skambinti greitajai pagalbai, ar ne? O, jeigu jo neturėtum, tektų bėgt iki artimiausio taksofono, kas gali užtrukti kelias ar keliasdešimt minučių. O juk tokiais atvejais kiekviena sekundė yra svarbi. Ir kiekvienas vaikas ar suaugęs žmogus nėra nuo to apsaugotas.

1

Hello World!

Rugsėjo 23, 2011

Taigi, kadangi tai mano pirmasis įrašas, pradėsiu nuo pasisveikinimo, kiek ilgokai galvojau, ką parašyti pirmajame įraše, nes prisistatyti jau spėjau parašęs straipsnelį “Apie save”, taip pat apie tinklaraštį ir jo specifiką pakalbėjau ten, tai čia kaip ir nebeliko, ką pridurti, o pradėti “bloginti” nepasisveikinus nesinorėjo. Galų gale, nemanau, kad daug žmonių iškart užsukę į mano tinklaraštį puls skaityti to “Apie mane”. Kad nesikartočiau, čia parašysiu artimiausius savo planus.

Visų pirma, norėčiau sukurti video pamokų ciklą apie PHP programavimą “for dummies”. Žinau, kad daugumai programuotojų PHP yra jau kiek pabodęs ir neįdomus reikalas. Galbūt kai kurie netgi bando pereiti prie kitokių web programavimo galimybių, kaip C++ ar Python. Taip pat žinau, kad PHP pamokų internete yra apstu ir, kas netingi, gali tikrai nesunkiai rasti informacijos apie tai, tačiau mano tikslas bus sudėti viską į vieną vietą ir judėti nuo pačių paprasčiausių dalykų iki sudėtingesnių. Pasikartosiu, kad pamokų serija bus skirta būtent pradedantiesiems, t.y. jose nebus vaizduojami labai “advanced” dalykai, kaip pvz. sklandus darbas su keliomis duomenų bazėmis, kitokių duomenų bazių nei MySQL naudojimas ar pan. dalykai. Galbūt ateityje pabandysiu sukurti kažką jau patyrusiems programuotojams.

Nesupraskit klaidingai, tos pamokėlės tikrai nebus vienintelis dalykas, kurį aš čia “postinsiu”. Rašysiu ir apie kitus dalykus – pasistengsiu čia informuoti apie naujienas, kurios man pasirodys įdomios, ir jas pakomentuoti ir pan. Na, pasistengsiu nebūti nuobodus. :)

Taip pat ateityje norėtųsi sukurti pamokų apie programavimą .NET aplinkoje, bet čia gan tolimos ateities planai, nes pats šioje srityje dar esu pakankamai žalias.

Dar norisi pridurti, kad šis blogas nebus vienas iš tų, kuris kepa straipsnius kasdien, pasistengsiu parašyti bent vieną straipsnį per savaitę. Žinau, kad kažkam tai atrodys mažai, bet stengiuosi orientuotis į kokybę, o ne kiekybę. Galbūt egzistuoja ir tokių blogų, kurie rašo naudingus straipsnius ir atnaujinami jie būna kasdien, tačiau aš neturiu tiek laiko, o rašyti beverčių straipsnių vien tam, kad atnaujinti tikrai nesinori.

Na ir pabaigai, mano kontaktus galima rasti “Kontaktai” skiltyje. Taigi, jeigu turite kažkokių pasiūlymų ar kritikos (o ji man yra labai svarbi), ar galų gale tiesiog norit pabendrauti, nesidrovėkit man parašyti per Skype ar FB. Ačiū! :)

3