Vinnaren i pepparkakshustävlingen!
2009-04-17, 11:11
  #13
Medlem
Citat:
Ursprungligen postat av Skandis

Han ville ju ha en mattelösning och programmeringshjälp.
Gulligt försök till bakdörrsmodering dock.

Jag ser ingen programmeringslösning här, utan bara amatörmattediskusion.
Citera
2009-04-17, 14:53
  #14
Medlem
dethalvabarnets avatar
Citat:
Ursprungligen postat av Skandis
1*1*(3/50)*(2/49)*(3/48)

De två första korten kan ju vara vilka som helst.

Detta är betingad sannolikhet och jag är väldigt rostig på det och matematik är inte min starka punkt
Revisering , det egentliga svaret är alla olika möjliga dragningar

Gissar på att det här är dom, har säkert fel igen

1*(3/51)*(2/50)*1*(3/48)+
1*(3/51)*1*(3/49)*(2/48)+
1*1*(3/50)*(2/49)*(3/48)+
1*1*(3/50)*(3/49)*(2/48)+
------------------------------------>~
6.03....*10-⁴
Citera
2009-04-17, 16:07
  #15
Medlem
dethalvabarnets avatar
ugh skulle kollat länken som ssh postar, allt står ju där :/ nm på mina poster
Citera
2009-04-17, 20:23
  #16
Medlem
Lich.queens avatar
Okej programmet klart

Kanske inte den snyggaste koden jag skrivit men den fungerar får en frekvens på 0.16,5 % men den verkar vela stiga efter ca 20 miljoner dragningar. Rand() funktionen är väl inte så random som man skulle hoppas men men..

Lägger gärna upp koden om någon vill testa.

Skandis: Sorry läste fel
Citera
2009-04-17, 21:07
  #17
Medlem
Detta låter intressant tittar gärna på koden.
Citera
2009-04-17, 21:14
  #18
Medlem
dethalvabarnets avatar
http://echochamber.me/viewtopic.php?f=12&t=14595

Har du gjort en nCR(som finns på miniräknarna) algorithm i c++ än LQ, tror den kan behövas för detta.
gjorde en motsvarande i java med BigInteger och min körning av 300000C100000 tog 47 sekunder.


Tillbaks till korten:
http://en.wikipedia.org/wiki/Poker_probability

52C5 = 2598960
13C1*4C3*12C1*4C2 = 3,744
(13C1*4C3*12C1*4C2)/52C5 = 0.0014405762304921968
3744 / 2598960 = 0.0014405762304921968 =~ 0.144%

Posta koden och får se hur du har tänkt.
Citera
2009-04-17, 22:06
  #19
Medlem
Citat:
Ursprungligen postat av Lich.queen
Rand() funktionen är väl inte så random som man skulle hoppas men men..

Det är för att det är en http://en.wikipedia.org/wiki/Pseudor...mber_generator. Kör du med C/C++ rand() så returnerar den också bara vanligtvis 15 bitar (se RAND_MAX).
__________________
Senast redigerad av kissekattt 2009-04-17 kl. 22:08.
Citera
2009-04-18, 11:47
  #20
Medlem
Lich.queens avatar
dethalvabarnet: Fick just en genomgång i permutationer av min käre far. Givetvis vore det intressant att ställa upp en algorithm. Du får gärna tipsa om några bra sidor om du har några.

Dock är det nuvarande programmet en simulator av den typ att den har en kortlek i form av en vektor och sedan drar 5 rand()-genererade kort och lägger dem i vectorn hand.

Kan för övrigt säga att jag lät servern stå på över natten och efter 4 miljarder dragningar så ligger sannolikheten på 0.1654 % Funderar även på att lägga till någon typ av intelligens så att den kan kasta 2 "dåliga" kort och plocka upp 2 nya, men vi får se hur det går med det
För övrigt så behövs inte valörerna i detta exempel, men tänkte att de kanske behövs i något framtida projekt

Kod:
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
double total=0;
double house=0;
vector<pair<string,int> > kortlek,backup;
vector<pair<string,int> > hand;
for(int i = 1;i <=13;i++)
backup.push_back(make_pair(string("H"),i));
for(int i = 1;i <=13;i++)
backup.push_back(make_pair(string("R"),i));
for(int i = 1;i <=13;i++)
backup.push_back(make_pair(string("K"),i));
for(int i = 1;i <=13;i++)
backup.push_back(make_pair(string("S"),i));
srand(time(NULL));
while(true)
{
total++;
kortlek = backup;
for(int i = 0; i < 5; i++)
{
int i = rand()%kortlek.size();
hand.push_back(kortlek[i]);
kortlek.erase(kortlek.begin()+i);
}
int triss = 0;
for(int i = 0; i < hand.size(); i++)
if(hand[i].second == hand[0].second)
{
triss++;
hand.erase(hand.begin()+i);        
}
if(triss == 3)
{
if(hand[0].second == hand[1].second)         
house++;
cout << "\r" << house/total << "\t" << total;
hand.clear();
}
}
}
Citera
2009-04-18, 12:02
  #21
Medlem
Det är inte konstigt att du ser märkliga beteenden för stora tal, eftersom du använde double till heltalsräknaren. Unsigned long känns rimligare tillsammans med försiktighet så den inte flödar över.

För övrigt kan du ha en hel kortlek och ge tio händer mellan blandningarna. Hand-kontrollen blir säkert klarare om du sorterar handen först.
Citera
2009-04-18, 12:12
  #22
Medlem
Lich.queens avatar
Citat:
Ursprungligen postat av Katalysator
Det är inte konstigt att du ser märkliga beteenden för stora tal, eftersom du använde double till heltalsräknaren. Unsigned long känns rimligare tillsammans med försiktighet så den inte flödar över.

Vad menar du med märkliga beteenden? Visst unsigned long fungerar väl också. Kanske är bättre eftersom, iaf vad jag lärt mig, inte kan flöda över då den arbetar i modulo 2^n. Dvs. om vi tar unsigned int som exempel som mest kan hålla 65535 om vi antar att int är 32 bitar. 65535+1 blir då 0 istället för att flöda över.

Citat:
För övrigt kan du ha en hel kortlek och ge tio händer mellan blandningarna. Hand-kontrollen blir säkert klarare om du sorterar handen först.

Detta får du förklara igen, förstod inte
Citera
2009-04-18, 12:29
  #23
Medlem
Citat:
Ursprungligen postat av Lich.queen
Vad menar du med märkliga beteenden? Visst unsigned long fungerar väl också. Kanske är bättre eftersom, iaf vad jag lärt mig, inte kan flöda över då den arbetar i modulo 2^n. Dvs. om vi tar unsigned int som exempel som mest kan hålla 65535 om vi antar att int är 32 bitar. 65535+1 blir då 0 istället för att flöda över.



Detta får du förklara igen, förstod inte
När din double har blivit tillräckligt gigantisk slutar den växa när du adderar det minimala talet ett.

Jag kallar det "flöda över" när unsigned (long) går runt till noll, men det kanske inte är helt korrekt språkbruk. Hur som helst är det uppenbart att man måste hålla koll på räknaren då den beter sig så.

Har du en array[52] med kort, så är den lätt att blanda med hjälp av en lagom lång loop och en temporär variabel. Man gör två slumpindex 0-51 och byter plats på de två elementen, helt enkelt. Efter det kan du ge korten på plats i leken genom att sätta en pekare (hand) till kortlek[0]. Nästa giv blir kortlek[5] o.s.v. till kortlek[45] då du blandar och börjar om på kortlek[0]. Den eventuella hand-sorteringen kan också göras på plats i leken.

Med en sorterad hand vet du att par och trissar ligger samlade. Exempelvis; om första och andra kortet är olika så kan du avbryta testet direkt, eftersom du då garanterat inte har en kåk på hand.
__________________
Senast redigerad av Katalysator 2009-04-18 kl. 12:33.
Citera
2009-04-18, 13:03
  #24
Medlem
PerFnurts avatar
Citat:
Ursprungligen postat av Lich.queen
om vi tar unsigned int som exempel som mest kan hålla 65535 om vi antar att int är 32 bitar. 65535+1 blir då 0 istället för att flöda över.

Du tänker på 16 bitars unsigned int.
32 bitars unsigned int har spannet 0 - 4294967295.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback