Advertisement
FractalFusion

Randil's math problem (C++ code)

Jan 19th, 2016
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <ctime>
  4. #include <random>
  5. #include <cmath>
  6.  
  7. #define TRIES 5000
  8.  
  9.  
  10. using namespace std;
  11.  
  12. int main()
  13. {
  14.     mt19937 mersenne(static_cast<unsigned int>(time(0)));
  15.  
  16.     for(int lo=1; lo<=18; lo++)
  17.         for(int hi=lo+1;hi<=19;hi++){
  18.    
  19.             double pr=0.05*hi, pw=0.05*lo;
  20.             double qr=1-pr, qw=1-pw;
  21.            
  22.             double agreen=log(pr/pw); //should be positive
  23.             double ared=log(qr/qw); //should be negative
  24.            
  25.             int countsum=0;
  26.             for(int temp=1;temp<=TRIES;temp++){
  27.            
  28.                 unsigned int thenum=mersenne()%10000;
  29.                 unsigned int num[]={thenum/1000, (thenum/100)%10, (thenum/10)%10, thenum%10};
  30.                
  31.                 int flags[10000]{};
  32.                 double logprobs[40]{};
  33.                 int countsgreen[40]{};
  34.                 int countsred[40]{};
  35.                
  36.                 //first guess
  37.                
  38.                 unsigned int theguess=mersenne()%10000;
  39.                 unsigned int guess[]={theguess/1000, (theguess/100)%10, (theguess/10)%10, theguess%10};
  40.                
  41.                
  42.                 int count=1;
  43.                 while(true){
  44.                     //check if guess matches num
  45.                     int check=1;
  46.                     for(int i=0;i<4;i++)
  47.                         if(guess[i]!=num[i]) {check=0; break;}
  48.                     if(check==1){//match
  49.                         break;
  50.                     }
  51.                    
  52.                     //no match
  53.                    
  54.                     //add occurrences
  55.                     for(int i=0;i<4;i++){
  56.                         if(guess[i]==num[i]){
  57.                             //green with prob pr, red with prob qr
  58.                             if(((double) mersenne())/mersenne.max() < pr) //green
  59.                                 countsgreen[10*i+guess[i]]++;
  60.                             else
  61.                                 countsred[10*i+guess[i]]++;
  62.                         }
  63.                         else{
  64.                             //green with prob pw, red with prob qw
  65.                             if(((double) mersenne())/mersenne.max() < pw) //green
  66.                                 countsgreen[10*i+guess[i]]++;
  67.                             else
  68.                                 countsred[10*i+guess[i]]++;
  69.                         }
  70.                     }
  71.                    
  72.                     //set flag so as to not guess it again
  73.                     flags[theguess]=1;
  74.                    
  75.                     //calculate normalized log likelihood for each digit
  76.                     for(int i=0;i<40;i++)
  77.                         logprobs[i]=agreen*countsgreen[i]+ared*countsred[i];
  78.                    
  79.                     //find largest normalized log likelihood over all 4-digit numbers
  80.                     //if ties, takes the first instance
  81.                     double largest=-100000;
  82.                     int lrg1=0,lrg2=0,lrg3=0,lrg4=0;
  83.                     for(int i1=0;i1<10;i1++)
  84.                         for(int i2=0;i2<10;i2++)
  85.                             for(int i3=0;i3<10;i3++)
  86.                                 for(int i4=0;i4<10;i4++)
  87.                                     if(!flags[1000*i1+100*i2+10*i3+i4]){
  88.                                         double s=logprobs[i1]+logprobs[10+i2]+logprobs[20+i3]+logprobs[30+i4];
  89.                                         if(s>largest){
  90.                                             largest=s;
  91.                                             lrg1=i1;
  92.                                             lrg2=i2;
  93.                                             lrg3=i3;
  94.                                             lrg4=i4;
  95.                                         }
  96.                                     }
  97.                                
  98.                    
  99.                     //next guess is lrg1 lrg2 lrg3 lrg4
  100.                    
  101.                     guess[0]=lrg1;
  102.                     guess[1]=lrg2;
  103.                     guess[2]=lrg3;
  104.                     guess[3]=lrg4;
  105.                     theguess=1000*lrg1+100*lrg2+10*lrg3+lrg4;
  106.                        
  107.                    
  108.                     count++;
  109.                     if(count>=10002){
  110.                         cout << "failed";
  111.                         exit(1);
  112.                     }
  113.                    
  114.                    
  115.                 }
  116.            
  117.                 countsum+=count;
  118.             }
  119.            
  120.             cout << fixed << setprecision(2) << "Average tries for pr=" << pr << " , pw=" << pw << ": " << ((double) countsum)/TRIES << endl;
  121.         }
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement