Tämä ohjelma laskee lotto tai muun vastaavan pelin voittotodennäköisyyden. Tähän tarvitaan numeroiden määrä, arvottujen numeroiden määrä ja oikein arvattujen numeroiden määrä. Todennäköisyyden laskemiseen tarvitaan kolme kombinaatiota, koska lotossa merkitystä on vain ,mitkä numerot on valittu ei se missä järjestyksessä.
Ensimmäinen kombinaatio on kaikkien mahdollisten valintojen määrä, joka lasketaan kaikista numeroista ja valittavien numeroiden määrästä. Seuraava kombinaatio on tietty määrä oikein valittujen numeroiden kombinaatio ja kolmas on tietty määrä väärin valittujen numeroiden kombinaatioiden määrä. Lopuksi lasketaan todennäköisyys.
use Tk; #Tämä ohjelma laskee todennäköisyyden, että arvotuista numeroista tietty määrä on oikein. #Tähän tarvitaan tieto kaikista numeroista ja arvottujen (eli oikeiden) numeroiden määrästä. #Esimerkiksi voidaan laskea, että 39 numerosta, josta valitaan 7 on tietty määrä oikein. my $main = MainWindow->new; $main->title("Lottovoitto"); my $teksti = ""; #Luodaan kontrollit. #Tulostetaan listaan todennäköisyys, että saadaan tietty määrä oikein. my $nappain = $main->Button(-text=>"Laske",-command=>\&Laske)->pack(); my $lappu = $main->Label(-textvariable=>\$teksti)->pack(); my $tlaatikko = $main->Entry()->pack(); my $lista = $main->Listbox(-selectmode=>"single")->pack(); #Lisätään selite. $teksti = "Numerot,oikeat"; sub Kertoma($){ my $n = int $_[0]; my $tulos = 1; $tulos *= $_ for 1 .. $n; return $tulos; } sub Todennakoisyys($$$$) { my $kaikki = int $_[0]; my $oikeat = int $_[1]; my $x = int $_[2]; my $binomi = int $_[3]; #Lasketaan binomikerroin ja todennäköisyys. #Binomikertoimia varten pitää laskea kertoimet my $binomi2 = Kertoma($oikeat)/(Kertoma($x)*Kertoma($oikeat-$x)); #Lasketaan niiden kombinaatioiden määrä, jotka on mahdollisuus saada oikein. my $vaarat = $oikeat-$x; my $binomi3 = Kertoma($kaikki-$oikeat)/(Kertoma($vaarat)*Kertoma($kaikki-$oikeat-$vaarat)); #Nyt on laskettu binomikertoimet, joten lasketaan todennäköisyys. my $tn = ($binomi2*$binomi3)/$binomi; return $tn; } sub Laske(){ #Tyhjennetään seuraavaa varten. $lista->delete(0.0,'end'); #Otetaan tiedot kaikkien numeroiden ja oikeiden numeroiden määrästä. @syote = split(',',$tlaatikko->get()); my $kaikki = int $syote[0]; my $oikeat = int $syote[1]; #Lasketaan mahdollisten yhdistelmien määrä. $binomi = Kertoma($kaikki)/(Kertoma($oikeat)*Kertoma($kaikki-$oikeat)); #Lasketaan todennäköisyydet kaikille määrille. for ($x = 0; $x <= $oikeat; $x+=1){ $lista->insert("end","$x : "); $lista->insert("end",Todennakoisyys($kaikki,$oikeat,$x,$binomi)); } } MainLoop;
En jaksa tällä kertaa puuttua Perl-kohtaisiin ongelmiin, kun et taida olla kiinnostunut kielen järkevästä käytöstä.
1) Koodissa käytetään kaavaa n!/(k!(n-k)!) kolmessa paikassa. Kannattaisi tehdä siitä oma funktio.
2) Yrittäisit edes keksiä järkevämpiä nimiä kuin $binomi
, $binomi2
, $binomi3
.
3) Todennakoisyyden viimeinen parametri voidaan laskea yksikäsitteisesti kahdesta ensimmäisestä, miksi tämä tehdään funktion ulkopuolella?
Aihe on jo aika vanha, joten et voi enää vastata siihen.