Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Sep 2nd, 2010 | Syntax: C++ | Size: 3.32 KB | Hits: 32 | Expires: Never
Copy text to clipboard
  1. #include <iostream>
  2. #include <inttypes.h>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <vector>
  6. #include <deque>
  7. #include <cstring>
  8. #include <cmath>
  9. using namespace std;
  10.  
  11. #define CARDS_NUM 36
  12. #define ITERATIONS 4096*128
  13.  
  14. // xxxxxxxx
  15. // 76543210
  16. // bits 1 and 0 - suit
  17. // bits 5,4,3,2 - value
  18. // 0000 - 6
  19. // 0001 - 7
  20. // 0010 - 8
  21. // 0011 - 9
  22. // 0100 - 10/A
  23. // 0101 - jack B
  24. // 0110 - queen C
  25. // 0111 - king D
  26. // 1000 - ace E
  27. // 6 beats ace
  28.  
  29. inline uint8_t getval(const uint8_t card){
  30.         return (card >> 2) & 0x0F;
  31. }
  32.  
  33. inline uint8_t getsuit(const uint8_t card){
  34.         return card & 0x3;
  35. }
  36.  
  37. // <0 if c1 < c2
  38. //  0 if c1 == c2
  39. // >0 if c1 > c2
  40.  
  41.  
  42. int8_t cmp(const uint8_t card1, const uint8_t card2){
  43.         uint8_t val1, val2;
  44.         val1 = getval(card1);
  45.         val2 = getval(card2);
  46.        
  47.         if((val1 == 0) && (val2 == 8)){
  48.                 return -1;
  49.         }
  50.         if((val1 == 8) && (val2 == 0)){
  51.                 return 1;
  52.         }
  53.         return val1 - val2;
  54. }
  55.  
  56. unsigned play(bool& winner){ //returns number of moves
  57.         vector<uint8_t> cards;
  58.         deque<uint8_t> player[2], add_deque;
  59.        
  60.         for(int i = 0; i < CARDS_NUM; i++){
  61.                 cards.push_back(i);
  62.         }
  63.        
  64.         for(int i = 0; cards.size() != 1; i++){
  65.                 int newcardnum = lrand48() % cards.size();
  66.                 player[i % 2].push_back(cards[newcardnum]);
  67.                 cards.erase(cards.begin()+newcardnum);
  68.         }
  69.         player[1].push_back(cards[0]);
  70.         cards.erase(cards.begin());
  71.        
  72.         unsigned moves = 0;
  73.         while(!(player[0].empty() || player[1].empty() )){
  74.                 moves++;
  75.                 int card1 = player[0].front();
  76.                 int card2 = player[1].front();
  77.                 int res = cmp(card1, card2);
  78.                
  79.                 player[0].pop_front();
  80.                 player[1].pop_front();
  81.                
  82.                 if(res == 0){
  83.                         if(lrand48()%2){
  84.                                 add_deque.push_back(card1);
  85.                                 add_deque.push_back(card2);
  86.                         }
  87.                         else{
  88.                                 add_deque.push_back(card2);
  89.                                 add_deque.push_back(card1);
  90.                         }
  91.                         continue;
  92.                 }
  93.                
  94.                 if(res < 0){
  95.                         while(!add_deque.empty()){
  96.                                 player[1].push_back(add_deque.front());
  97.                                 add_deque.pop_front();
  98.                         }
  99.                         if(lrand48()%2){
  100.                                 player[1].push_back(card1);
  101.                                 player[1].push_back(card2);
  102.                         }
  103.                         else{
  104.                                 player[1].push_back(card2);
  105.                                 player[1].push_back(card1);
  106.                         }      
  107.                 }
  108.                 if(res > 0){
  109.                         while(!add_deque.empty()){
  110.                                 player[0].push_back(add_deque.front());
  111.                                 add_deque.pop_front();
  112.                         }
  113.                         if(lrand48()%2){
  114.                                 player[0].push_back(card1);
  115.                                 player[0].push_back(card2);
  116.                         }
  117.                         else{
  118.                                 player[0].push_back(card2);
  119.                                 player[0].push_back(card1);
  120.                         }      
  121.                 }
  122.         }
  123.        
  124.         winner = player[0].empty();
  125.         return moves;
  126. }
  127.  
  128. long double stats(const vector<unsigned> results, const vector<bool> winners, long double& winner, long double& stdev){
  129.         long double mean = 0;
  130.         winner = stdev = 0;
  131.        
  132.         int total = results.size();
  133.        
  134.         for(int i = 0; i < total; i++){
  135.                 mean += ((long double)results[i]) / ((long double)total);
  136.                 winner += ((long double)winners[i]) / ((long double)total);
  137.         }
  138.        
  139.         for(int i = 0; i < total; i++){
  140.                 stdev += pow(mean - (long double)results[i],2) / ((long double)total);
  141.         }
  142.         stdev = sqrt(stdev);
  143.        
  144.         return mean;
  145. }
  146.  
  147. int main(int, char**){
  148.         srand48(time(NULL));
  149.         vector<bool> winners;
  150.         vector<unsigned> results;
  151.         bool temp;
  152.         long double winner, stdev;
  153.        
  154.         for(int i = 0; i < ITERATIONS; i++){
  155.                 results.push_back(play(temp));
  156.                 winners.push_back(temp);
  157.         }
  158.  
  159.         cout << stats(results, winners, winner, stdev) << "\t";
  160.         cout << winner << "\t" << stdev << endl;
  161.        
  162.         return 0;
  163. }