Keksin tälläisen pelin (en tiedä onko joku jo keksinyt ennen minua), jota voi pelata vaikka pelikorteilla, joista on valittu kortit A, 2, 3, 4, ... 13 (helpotukseksi vain 1 kutakin arvoa)ja lisäksi laput, joissa on nuo numerot.
Ensin valitaan kuinka monta korttia halutaan ottaa "kierrokseen" ja ne sekoitetaan ja asetetaan pöydälle nurin päin. Sen jälkeen pelaaja laittaa numero laput korttien päälle (1 kunkin päälle). Sitten katsotaan kuinka moni on mennyt oikein.
Maksut ja voitot:
Täytyisi selvittää kuinka paljon minkäkinlainen kierros (2, 3, 4,... ,13) maksaa, jos odotusarvo olisi aina suunnilleen hieman pienempi kuin 0 (esim. -1€, jos pelataan "10€-luokassa").
Jokaisesta oikein menneestä arvauksesta saisi tietyn voiton (vaikkapa 2€).
2 kortin kierros on melko helppo laskea.
Olkoon a1 sen hinta
E(X) = 0 0 4 * P(2 oikein) - a1
E(X) = 4*0,5 - a1 = -1
a1 = 3
Mutta sitten useamman kortin kierrokset tulevatkin hankalemmiksi. Kun nuo tapaukset ovat toisistaan riippuvaisia. Osaisiko joku neuvoa miten niitä voisi laskea, vai meneekö se liian työlääksi?
Ensin valitaan kuinka monta korttia halutaan ottaa "kierrokseen" ja ne sekoitetaan ja asetetaan pöydälle nurin päin. Sen jälkeen pelaaja laittaa numero laput korttien päälle (1 kunkin päälle). Sitten katsotaan kuinka moni on mennyt oikein.
Maksut ja voitot:
Täytyisi selvittää kuinka paljon minkäkinlainen kierros (2, 3, 4,... ,13) maksaa, jos odotusarvo olisi aina suunnilleen hieman pienempi kuin 0 (esim. -1€, jos pelataan "10€-luokassa").
Jokaisesta oikein menneestä arvauksesta saisi tietyn voiton (vaikkapa 2€).
2 kortin kierros on melko helppo laskea.
Olkoon a1 sen hinta
E(X) = 0 0 4 * P(2 oikein) - a1
E(X) = 4*0,5 - a1 = -1
a1 = 3
Mutta sitten useamman kortin kierrokset tulevatkin hankalemmiksi. Kun nuo tapaukset ovat toisistaan riippuvaisia. Osaisiko joku neuvoa miten niitä voisi laskea, vai meneekö se liian työlääksi?
Vastaukset 4
Vanhimmat
Ymmärsinköhän nyt pelisi oikein: pelaajalla on n kpl erilaisia kortteja, ja sitten niitä kortteja vastaavat laput. Pelaaja laittaa kortit pöydälle, ja laput niiden päälle. Ja sitten katsotaan kuinka monta lappua ja korttia vastasi toisiaan.
Jos peli meni jotenkin muuten, kerro, niin ihmetellään sitten sitä. Mutta jos se oli noin kuin sen kuvasin, niin todennäköisyydet saada x korttia oikein n kortin pelissä voi laskea laskemalla mahdolliset kombinaatiot.
Eri mahdollisuuksien kokonaismäärä n kortin pelissä on n!.
n korttia oikein kombinaatioita on aina 1.
n-1 korttia oikein kombinaatiota on aina 0. (Jos kaikki muut kortit on oikein, myös sen viimeisen kortin pitää olla oikein)
x korttia oikein kombinaatioiden määrän voi laskea ainakin rekursiivisesti seuraavasti (voi olla että helpompiakin tapoja olisi, en tiedä):
Merkitään:
k(x,n): niiden kombinaatioiden lukumäärä, jotka sisältävät x oikein n kortin pelissä.
Eli esimerkiksi k(2,4) tarkoittaisi niiden kombinaatioiden määrä, joilla saa 2 oikein 4 kortin pelissä. Kun 4 kortin pelissä on 4! vaihtoehtoa, on todennäköisyys tälle voitolle siis k(2,4)/4!.
Sitten se rekursio:
k(x,n) = k(x-1,n-1) (n-1) * ( k(x,n-2) (n-2) * ( k(x,n-3) ... ))
k(0,1) = k(a,a) = 1, k(a,b) = 0 kun b < a
Käytännössä tätä on helpoin laskea pienistä peleistä ylöspäin:
2 kortin pelissä kombinaatioita on seuraavasti:
2 oikein (k(2,2)): 1 kpl
1 oikein (k(1,2)): 0 kpl
0 oikein (k(0,2)): 1 kpl
3 kortin peli (yhteensä 3! = 6 mahdollisuutta):
3 oikein (k(3,3)): 1 kpl
2 oikein (k(2,3)): 0 kpl
1 oikein (k(1,3)): k(0,2) 2 * k(1,1) = 3 kpl
0 oikein (k(0,3)): 2 * k(0,1) = 2 kpl
4 kortin peli (yhteensä 4! = 24 vaihtoehtoa):
4 oikein (k(4,4)): 1 kpl
3 oikein (k(3,4)): 0 kpl
2 oikein (k(2,4)): k(1,3) 3 * k(2,2) = 6 kpl
1 oikein (k(1,4)): k(0,3) 3 * (k(1,2) 2 * k(1,1)) = 8 kpl
0 oikein (k(0,4)): 3 * (k(0,2) 2 * k(0,1)) = 9 kpl
5 kortin peli (yhtensä 5! = 120 vaihtoehtoa):
5 oikein (k(5,5)): 1 kpl
4 oikein (k(4,5)): 0 kpl
3 oikein (k(3,5)): k(2,4) 4 * k(3,3) = 10 kpl
2 oikein (k(2,5)): k(1,4) 4 * (k(2,3) 3 * k(2,2)) = 20 kpl
1 oikein (k(1,5)): k(0,4) 4 * (k(1,3) 3 * (k(1,2) 2 * k(1,1))) = 45 kpl
0 oikein (k(0,5)): 4 * (k(0,3) 3 * (k(0,2) 2 * k(0,1))) = 44 kpl
6 kortin pelissä (yhteensä 6! = 720 vaihtoehtoa):
6 oikein (k(6,6)): 1 kpl
5 oikein (k(5,6)): 0 kpl
4 oikein (k(4,6)): k(3,5) 5 * k(4,4) = 15 kpl
3 oikein (k(3,6)): k(2,5) 5 * (k(3,4) 4 * k(3,3)) = 40 kpl
2 oikein (k(2,6)): k(1,5) 5 * (k(2,4) 4 * (k(2,3) 3 * k(2,2))) = 135 kpl
1 oikein (k(1,6)): k(0,5) 5 * (k(1,4) 4 * (k(1,3) 3 * (k(1,2) 2 * k(1,1)))) = 264 kpl
0 oikein (k(0,6)): 5 * (k(0,4) 4 * (k(0,3) 3 * (k(0,2) 2 * k(0,1)))) = 265 kpl
Eli todennäköisyys saada 3 oikein 6 kortin pelissä on 40/720 = 1/18. Siitä vaan kertoimia laskemaan.
Ja tuota voi sitten jatkaa sinne 13 korttiin asti tai vaikka kuinka pitkään, jos haluaa.
Joo, kyllä noin se peli menee.
Mitenkäs en tullut noita erilaisia mahdollisia järjestyksiä ja sitä kautta ajatelleeksi... ;)
Voisitko vähän vielä selittää tuota rekursiota?
k(x,n) = k(x-1,n-1) (n-1) * ( k(x,n-2) (n-2) * ( k(x,n-3) ... ))
Kun en oikein tajua miten tuo toimii... ;)
"Voisitko vähän vielä selittää tuota rekursiota?
k(x,n) = k(x-1,n-1) (n-1) * ( k(x,n-2) (n-2) * ( k(x,n-3) ... ))
Kun en oikein tajua miten tuo toimii... ;)"
Jos halutaan tietää x oikein kombinaatioden määrän n kortin pelissä, tarvitsemme:
1) x-1 oikein kombinaatioiden määrän n-1 kortin pelissä, ja
2) x oikein kombinaatioiden määrän n-2 pelissä, n-3 pelissä, ja näin taaksepäin aina x oikein x kortin pelissä, joka määritelmän mukaan on 1. Näitä termejä sitten kerrotaan ja lasketaan yhteen tuon kaavan mukaisesti.
3) Tiedot, että k(0,1) = 1, k(x,n) = 1 kun x = n, k(x,n) = 0 kun n < x, jotta rekursio päättyisi joskus.
Ja jokainen noista termeistä tietenkin aukeaa uudeksi vastaavaksi rekursioksi, joka pitää laskea samalla tavalla. Isommilla x ja n arvoilla laskettavaa tulee äkkiä aika lailla.
Todennäköisyys voitolle on tietenkin kombinaatioiden määrä jaettuna kombinaatioiden kokonaismäärällä, joka n kortin pelissä on n! eli n kertoma. Kertoman voi myös esittää rekursiona:
n! = n * (n-1)!, 1! = 1
Selventäisiköhän asiaa, jos yrittäisin esittää tuon kombinaatioiden laskemisen ohjelmakoodina. C:llä (en ole tätä testannut, kirjoitan sen vain tähän suoraan päästäni, joku muu voi testata jos haluaa) homma menisi näin:
int n = kaikki_kortit; // pitää olla 2 tai enemmän
int x = oikeat_kortit; // pitää olla välillä 0, n - 2
int k; // kombinaatioiden määrä
float t; // todennäköisyys 0..1
k = kombinaatiot (x, n);
t = (float) k / kertoma (n);
int kombinaatiot (int x, int n) {
if (n < x) return 0;
else if (n == x || (x == 0 && n == 1)) return 1;
else
{
int a = kombinaatiot (x-1, n-1); // k(x-1,n-1) termi
while (--n > x) //(n-1) * ( k(x,n-2) ... ) termit
{
a = n * kombinaatiot(x, n-1);
}
return a;
}
}
int kertoma (int n) {
if (n == 1) return 1;
else return (n * kertoma (n-1));
}
En nyt ole varma, että tuo meni ihan oikein, mutta idea on tuo. Sääli, että sisennykset eivät näy oikein, mutta toivottavasti saat selvää.
Toivottavasti tämä selvensi.
Eihän tuo noin mennyt, tuossahan tarvitaan kaksi sisäkkäistä rekursiota. Uusi yritys:
int x = oikeat_kortit; // pitää olla välillä 0, n - 2
int k; // kombinaatioiden määrä
float t; // todennäköisyys 0..1
k = kombinaatiot (x, n);
t = (float) k / kertoma (n);
int kombinaatiot (int x, int n) {
if (n < x) return 0;
else if (n == x || (x == 0 && n == 1)) return 1;
else return (kombinaatiot (x-1, n-1) kombinaatiot2 (x, n-1));
}
//(n-1) * ( k(x,n-2) ... ) termit
int kombinaatiot2 (int x, int n) {
if (n == x) return 0;
else return (n * (kombinaatiot (x, n-1) kombinaatiot2 (x, n-1)));
}
int kertoma (int n) {
if (n == 1) return 1;
else return (n * kertoma (n-1));
}