Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <ctime>
- #include <random>
- #include <cmath>
- #define TRIES 5000
- using namespace std;
- int main()
- {
- mt19937 mersenne(static_cast<unsigned int>(time(0)));
- for(int lo=1; lo<=18; lo++)
- for(int hi=lo+1;hi<=19;hi++){
- double pr=0.05*hi, pw=0.05*lo;
- double qr=1-pr, qw=1-pw;
- double agreen=log(pr/pw); //should be positive
- double ared=log(qr/qw); //should be negative
- int countsum=0;
- for(int temp=1;temp<=TRIES;temp++){
- unsigned int thenum=mersenne()%10000;
- unsigned int num[]={thenum/1000, (thenum/100)%10, (thenum/10)%10, thenum%10};
- int flags[10000]{};
- double logprobs[40]{};
- int countsgreen[40]{};
- int countsred[40]{};
- //first guess
- unsigned int theguess=mersenne()%10000;
- unsigned int guess[]={theguess/1000, (theguess/100)%10, (theguess/10)%10, theguess%10};
- int count=1;
- while(true){
- //check if guess matches num
- int check=1;
- for(int i=0;i<4;i++)
- if(guess[i]!=num[i]) {check=0; break;}
- if(check==1){//match
- break;
- }
- //no match
- //add occurrences
- for(int i=0;i<4;i++){
- if(guess[i]==num[i]){
- //green with prob pr, red with prob qr
- if(((double) mersenne())/mersenne.max() < pr) //green
- countsgreen[10*i+guess[i]]++;
- else
- countsred[10*i+guess[i]]++;
- }
- else{
- //green with prob pw, red with prob qw
- if(((double) mersenne())/mersenne.max() < pw) //green
- countsgreen[10*i+guess[i]]++;
- else
- countsred[10*i+guess[i]]++;
- }
- }
- //set flag so as to not guess it again
- flags[theguess]=1;
- //calculate normalized log likelihood for each digit
- for(int i=0;i<40;i++)
- logprobs[i]=agreen*countsgreen[i]+ared*countsred[i];
- //find largest normalized log likelihood over all 4-digit numbers
- //if ties, takes the first instance
- double largest=-100000;
- int lrg1=0,lrg2=0,lrg3=0,lrg4=0;
- for(int i1=0;i1<10;i1++)
- for(int i2=0;i2<10;i2++)
- for(int i3=0;i3<10;i3++)
- for(int i4=0;i4<10;i4++)
- if(!flags[1000*i1+100*i2+10*i3+i4]){
- double s=logprobs[i1]+logprobs[10+i2]+logprobs[20+i3]+logprobs[30+i4];
- if(s>largest){
- largest=s;
- lrg1=i1;
- lrg2=i2;
- lrg3=i3;
- lrg4=i4;
- }
- }
- //next guess is lrg1 lrg2 lrg3 lrg4
- guess[0]=lrg1;
- guess[1]=lrg2;
- guess[2]=lrg3;
- guess[3]=lrg4;
- theguess=1000*lrg1+100*lrg2+10*lrg3+lrg4;
- count++;
- if(count>=10002){
- cout << "failed";
- exit(1);
- }
- }
- countsum+=count;
- }
- cout << fixed << setprecision(2) << "Average tries for pr=" << pr << " , pw=" << pw << ": " << ((double) countsum)/TRIES << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement