Gå till innehåll

Singa slant spel, hjälp med sannolikhetsberäkningar!


Recommended Posts

Postad

Först och främst så får QoS gärna reposta min tråd eftersom den inte handlar om poker borde den inte ligga här men jag anser att den är mera poker än off topic ;)

QoS får även min tillåtelste till RP eftersom jag inte kom på någon passande rubrik. (inte för att QoS skulle låta min rubrik vara hur bra den än är ;) men iaf...)

 

 

:shock: Om två spelare, låt oss kalla dem x och y spelar ett spel där man hela tiden satsar EN marker o sedan använder en slumpmaskin för att bestämma vem som vinner båda markerna. Antag att x vinner 40% av gångerna och därmed får båda markerna, och därmed att y vinner resterande 60% av gångerna. Spelet förtsätter tills en av spelarna har samlat ihop alla markerna. Man kan alltså inte reglera något när man spelar utan det är bara att köra vidare tills det tar slut.

 

1. Om båda börjar med samma antal marker hur beräknar man hur stor chans x respektive y har att vinna? Jag söker alltså en formel så jag kan beräkna hur stor chans vardera spelare har att vinna vid ett givet antal startmarker, så jag kan stoppa in start markerantal och se sannolikheterna.

 

2. Finns det något sätt att göra om beräkningen men att x och y börjar med olika mycket marker? Jag är då intreserad av när x har fler marker än y. Om x har 60 marker och y har 40, eller x har 600 och y 400 (dessa två ger ju olika resultat, eller är jag helt ute och cyklar?). (OBS jag vill inte ha bara 60%/40%, var bara så att exemplena blev så).

 

Jag söker alltså en formel där jag kan stoppa in hur många marker vardera spelare börjar med och sedan få fram hur stor sannolikhet de har att vinna.

 

3. Om någon orkar så är jag även intreserad av en formel där man förrutom ovanstående kan sätta in hur stor chans x,y har att vinna, dvs att man matar in att x ska ha 10% eller att x ska ha 35%.

 

Tack på förhand från er oerhört tjocka Tjockisbagare, övertygad om att jag får några vettiga svar iallafall^^, eller har jag fel? :shock:

Postad

Inte så lätt som man kanske tror, måste bli någon limes grej av något slag kanske...men jag kan det inte utantill och orkar inte försöka. Jag vet att jag frågade min gamla mattelärare om en liknande sak (något komplexare dock, men samma idé) men han hade inget svar , fast att han knåpade på det över någon dag.

 

Om ingen kommer med svaret så tror jag det lättaste är att simulera det för specifika värden, om du inte vill ha ett exakt svar förstås.

Postad

jag vet själv inte hur man bör göra eftersom det inte är ett givet antal "slantsinglingar", annars kan man ju i princip göra ett träddiagram även om det är väldigt jobbigt och inte går för fler än typ 2 singlingar om man inte har bra motivation...

 

Limes grej.. hmm, låter intresant men själv är man såklart för dum för att klara det själv.

 

Hur simulerar man värden för sånt här? Om du råkar ha ett program som låter mig simulera nr 3, dvs jag väljer alla värden så räcker det gott och väl förutsatt att man kan göra typ 1000 beräkningar

 

Kanske kan fråga ma läraren imorgon då hon är typ grovt grym men jag hoppades på ett svar idag!

Postad
Limes grej.. hmm, låter intresant men själv är man såklart för dum för att klara det själv.

Beräkning av gränsvärden. Sannolikheten för de olika utfallen borde gå emot vissa värden då antalet slantsinglingar går mot oändligheten.

 

Hur simulerar man värden för sånt här?

Skriv ett program (eller be någon göra det). Alternativt singla några miljoner gånger för hand ;)

Postad
Limes grej.. hmm, låter intresant men själv är man såklart för dum för att klara det själv.

Beräkning av gränsvärden. Sannolikheten för de olika utfallen borde gå emot vissa värden då antalet slantsinglingar går mot oändligheten.

 

Hur simulerar man värden för sånt här?

Skriv ett program (eller be någon göra det). Alternativt singla några miljoner gånger för hand ;)

 

Tack så hemskt mycket för att du är snäll och förklarar, tråkigt nog visste jag vad lim värden är men jag vet inte hur man räknar ut dem, hållt på en del med lim i skolan men det var bara i samband med derivata o diverse lätt tjafs. Jag vet vad det är men inte hur man använder det.

 

Kanske ska testa att göra ett program själv för en gångs skull, synd bara att jag avinstalerat c++ :( Ingen som har lust o hjälpa mig?

Postad

Kan ge en förklaring till hur du löser fallet med två spelare som singlar slant. Alltså 50% chans att vinna. Antingen vinner man 1kr eller förlorar man 1kr.

 

Personer A,B Förmögenhet a,b

Spelet körs tills någon blir ruinerad.

 

Antag att A i ett visst ögonblick har n kr och B har då a+b-n kr. Pn är sannolikheten att A kommer att bli ruinerad när han har n kr. Detta ger Pn=0.5Pn+1+0.5Pn-1 (Alltså Pn+1 n+1 är index)

För att bestämma denna rekursiva relation utnyttjar man att punkterna (n, Pn) ligger på en rät linje. Alltså erhålles Pn=C1+C2n

 

För att bestämma C1 och C2 använder man att man vet att Pa+b=0 (pga har han hela kassan kan han inte bli ruinerad) och P0=1 (Har han 0 kr är han ruinerad)

 

Dessa vilkor ger Pn=1-n/(a+b)

 

Sätter vi då n=a får vi sannolikheten att A blir ruinerad till b/(a+b) och sannolikheten för B är a/(a+b)

 

Exempel: Om A börjar med 10kr och B med 100kr så är det 100/110=0.91 chans att A blir ruinerad

 

EDIT Pn det kursiva n:et är alltså ett index n. Alla kursiva tecken är index.

Postad

Jag slängde ihop ett simuleringsprogram mest för skojs skull. Du kan själv kompilera och köra det i DevC++. Observera att jag inte garanterar att de utfall man får av programmet är sanna. Jag använder systemklockan och rand() så det är bara pseudoslump men det kanske kan ge en fingervisning förhoppningsvis. Om det är någon som ser direkt att jag har gjort något fel så får ni gärna kommentera och rätta till det. Jag är ingen expert och jag slängde ihop det i all hast. Observera att koden blir lite fult formaterad när man klistrar in det så här. Nåväl enough said här är koden:

 

#include <cstdlib>

#include <iostream>

#include <time.h>

 

using namespace std;

 

int main(int argc, char *argv[])

{

char val;

int utfall[100];

int a,b,sumA,sumB,avinst=0,bvinst=0,times=0,j=0;

do{

cout<<"Ange spelare A:s chans i %: ";

cin>>a;

cout<<"\nAnge spelare A:s antal marker: ";

cin>>sumA;

cout<<"\nAnge spelare B:s antal marker: ";

cin>>sumB;

b=100-a;

srand ( time(NULL) );

for(int i=1;i<=a;i++)

utfall=1; //Tilldelar a:s utfall som ettor i vektorn.

for(int i=a+1;i<=100;i++)

utfall=0; //Tilldelar b:s utfall som nollor i vektorn.

for(int i=1;i<=100;i++)

cout<<utfall<<", "<<i<<"\n";

 

while((sumA>0)&&(sumB>0)){

times++;

j=1+rand()%100; //Slumpa fram ett nummer mellan 1 och 100.

if(utfall[j]==1){

sumA++;

sumB--;

avinst++;

}

else{

sumA--;

sumB++;

bvinst++;

}

 

}

if (sumA==0){

cout<<"Spelare B vann! Det tog "<<times<<" spel!\n";

cout<<"Spelare A vann "<<avinst <<" ggr och spelare B vann "<<bvinst<<" ggr!\n";

}

else{

cout<<"Spelare A vann! Det tog "<<times<<" spel!\n";

cout<<"Spelare A vann "<<avinst <<" ggr och spelare B vann "<<bvinst<<" ggr!\n";

}

cout<<"Tryck 0 om du vill avsluta, annars valfri tangent och ENTER.";

cin>>val;

}while(val!='0');

 

system("PAUSE");

return EXIT_SUCCESS;

}

 

EDIT: Upptäckte en klantig grej jag hade lagt in. Man behöver ju bara ange procentchansen för den första spelaren, känns som lite dubbelarbete att ange för både spelare a och spelare b. Klistrar in den nya koden.

Postad

hotshot: Snyggt (antar att det stämmer), ska kolla på det när jag är piggare imorgon.

 

Dollarturist: Kollade inte jättenoga, men en yttre loop behövs för att göra om försöket x antal ggr för att på så vis uppskatta slh, annars funkar det säkert bra. (En petitess förresten: slh för B är lika med 1-A:s, så slipper du en inmatning o en koll för att det är rätt.)

 

Antar att man är en nörd om man tittar på sånt här kl 01:00 en natt mot måndag... :roll:

Postad

Ändrade lite i koden. Nu kör den tusen simuleringar. Kör man med 100 marker var eller mindre så går simuleringarna snabbt. Kör man med 500 marker så tar det lite tid. Fler marker än så skulle jag inte rekommendera att köra utan att ha väldigt gott om tid på sig.

 

Kod:

 

#include <cstdlib>

#include <iostream>

#include <time.h>

 

using namespace std;

 

int main(int argc, char *argv[])

{

char val;

int utfall[100];

int a,b,j,sumAold,sumBold,sumA=0,sumB=0,times=0,N=100;

do{

srand ( time(NULL) );

cout<<"Ange spelare A:s chans i %: ";

cin>>a;

cout<<"\nAnge spelare A:s antal marker: ";

cin>>sumAold;

cout<<"\nAnge spelare B:s antal marker: ";

cin>>sumBold;

if(a>100)

cout<<"Fel inmatning! Max 100% vinstchans!\n";

else{

b=100-a;

float prob=0,af=0,bf=0;

for(int i=0;i<a;i++)

utfall=1; //Tilldelar a:s utfall som ettor i vektorn.

for(int i=a;i<100;i++)

utfall=0; //Tilldelar b:s utfall som nollor i vektorn.

 

 

for(int m=0;m<1000;m++){

j=0;

sumA=sumAold;

sumB=sumBold;

 

while((sumA>0)&&(sumB>0)){

times++;

//j=(int)((double)rand() / ((double)RAND_MAX + 1) * N);

j=(int)((double)rand() / ((double)RAND_MAX) * N);

if(utfall[j]==1){

sumA++;

sumB--;

}

else{

sumA--;

sumB++;

}

 

}

if (sumA==0){

bf++;

}

else{

af++;

}

}

 

float k = 1000.00;//Ändra k när antalet loopar ändras.

prob=af/k;

prob=prob*100.00;

cout<<"A-vinst: "<<af<<"\n";

cout<<"B-vinst: "<<bf<<"\n";

cout<<"A vinner alla marker "<<prob<<" % av alla ggr!\n";

}

cout<<"Tryck 0 om du vill avsluta, annars valfri tangent och ENTER.";

cin>>val;

}while(val!='0');

 

//system("PAUSE");

return EXIT_SUCCESS;

}

Postad
Kan ge en förklaring till hur du löser fallet med två spelare som singlar slant. Alltså 50% chans att vinna. Antingen vinner man 1kr eller förlorar man 1kr.

 

Personer A,B Förmögenhet a,b

Spelet körs tills någon blir ruinerad.

 

Antag att A i ett visst ögonblick har n kr och B har då a+b-n kr. Pn är sannolikheten att A kommer att bli ruinerad när han har n kr. Detta ger Pn=0.5Pn+1+0.5Pn-1 (Alltså Pn+1 n+1 är index)

För att bestämma denna rekursiva relation utnyttjar man att punkterna (n, Pn) ligger på en rät linje. Alltså erhålles Pn=C1+C2n

 

För att bestämma C1 och C2 använder man att man vet att Pa+b=0 (pga har han hela kassan kan han inte bli ruinerad) och P0=1 (Har han 0 kr är han ruinerad)

 

Dessa vilkor ger Pn=1-n/(a+b)

 

Sätter vi då n=a får vi sannolikheten att A blir ruinerad till b/(a+b) och sannolikheten för B är a/(a+b)

 

Exempel: Om A börjar med 10kr och B med 100kr så är det 100/110=0.91 chans att A blir ruinerad

 

EDIT Pn det kursiva n:et är alltså ett index n. Alla kursiva tecken är index.

 

Tack för hjälpen men jag menade att man singlar slant med en buggad krona så sannolikheterna är 40% och 60% eller bara slumpgenerator med dessa sannolikheter, kanske var förvirrande att jag skrev singa slant men inte 50/50

 

Tack iaf

Postad

Tack för hjälpen men jag menade att man singlar slant med en buggad krona så sannolikheterna är 40% och 60% eller bara slumpgenerator med dessa sannolikheter, kanske var förvirrande att jag skrev singa slant men inte 50/50

Kompilera och kör koden jag postade sist med DevC++. Det programmet gör är exakt det du skriver.

 

Du får själv sätta chansen för "slantsinglingen" för person A och implicit sätts då chansen för person B (t.ex 60/40). Sedan väljer du antal marker person A resp. B ska ha. De singlar sedan slant tills någon av dem är bankrutt och sedan upprepas den proceduren 1000 ggr. Därefter redovisas hur många ggr A resp B vann och hur många gånger A vann i % räknat. Tyvärr tar simuleringen ganska lång tid när person A och B börjar få mycket marker men...

 

Om du är ovan med kompilatorer så kan jag skicka det kompilerade programmet till dig.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gäst
Svara i detta ämne...

×   Du har klistrat in innehåll med formatering.   Ta bort formatering

  Endast 75 max uttryckssymboler är tillåtna.

×   Din länk har automatiskt bäddats in.   Visa som länk istället

×   Ditt tidigare innehåll har återställts.   Rensa redigerare

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Skapa nytt...