Created
August 31, 2017 02:58
-
-
Save 3735943886/a1bb9bb9f67b5bf1c672f8dd164e4dad to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| Monty Hall Simulator by 3735943886 | |
| Using Microsft Cryptography APIs for random generations | |
| License : GPL | |
| */ | |
| #include <iostream> | |
| #include <windows.h> | |
| #include <wincrypt.h> | |
| #pragma comment(lib, "advapi32.lib") | |
| using namespace std; | |
| // Number of doors | |
| const unsigned int MaxDoor = 3; | |
| // Boolean flag for Host's will | |
| const bool ExcludeCorrectDoor = false; | |
| enum | |
| { | |
| car = 0, | |
| guest = 1, | |
| host = 2, | |
| guest2 = 3 | |
| }; | |
| int main() | |
| { | |
| // Variables for Random Numbers | |
| HCRYPTPROV hCryptProv; | |
| DWORD dwRandomNum[4]; | |
| // Boolean flag for playing game or not | |
| bool Selecting = false; | |
| // Total number of Games | |
| unsigned int TryNum; | |
| // Number of correct answers (guest switched choice) | |
| unsigned int CorrectChanged = 0; | |
| // Number of correct answers (guest didn't switch choice) | |
| unsigned int CorrectUnchanged = 0; | |
| cout << "Monty Hall Simulator by 3735943886" << endl; | |
| cout << "Input : "; cin >> TryNum; | |
| if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) | |
| { | |
| CorrectChanged = 0; CorrectUnchanged = 0; | |
| for(unsigned int i = 0; i < TryNum; i++) | |
| { | |
| Selecting = true; // True if game is playing | |
| while(Selecting) | |
| { | |
| Selecting = false; | |
| // Generating Random Number | |
| if(!CryptGenRandom(hCryptProv, sizeof(dwRandomNum), (LPBYTE)dwRandomNum)) | |
| break; | |
| // Convert the random number to door number | |
| dwRandomNum[car] %= MaxDoor; dwRandomNum[guest] %= MaxDoor; | |
| if(ExcludeCorrectDoor) | |
| { | |
| // Host doesn't select the correct door | |
| if(dwRandomNum[car] == dwRandomNum[guest]) | |
| { | |
| // If guest selected correct door | |
| CorrectUnchanged++; | |
| } | |
| else | |
| { | |
| // If guest selected wrong door | |
| // Host should select another door | |
| dwRandomNum[host] %= (MaxDoor - 2); | |
| if(dwRandomNum[host] >= dwRandomNum[car] || | |
| dwRandomNum[host] >= dwRandomNum[guest]) | |
| dwRandomNum[host]++; | |
| if(dwRandomNum[host] >= dwRandomNum[car] && | |
| dwRandomNum[host] >= dwRandomNum[guest]) | |
| dwRandomNum[host]++; | |
| // Guest select door again | |
| dwRandomNum[guest2] %= (MaxDoor - 2); | |
| if(dwRandomNum[guest2] >= dwRandomNum[guest] || | |
| dwRandomNum[guest2] >= dwRandomNum[host]) | |
| dwRandomNum[guest2]++; | |
| if(dwRandomNum[guest2] >= dwRandomNum[guest] && | |
| dwRandomNum[guest2] >= dwRandomNum[host]) | |
| dwRandomNum[guest2]++; | |
| // If correct, | |
| if(dwRandomNum[guest2] == dwRandomNum[car]) | |
| CorrectChanged++; | |
| } | |
| } | |
| else | |
| { | |
| // Host doesn't know which door is correct | |
| if(dwRandomNum[car] == dwRandomNum[guest]) | |
| { | |
| // If guest selected correct door | |
| CorrectUnchanged++; | |
| } | |
| else | |
| { | |
| // If guest selected wrong door, | |
| // Host should select another door | |
| dwRandomNum[host] %= (MaxDoor - 1); | |
| if(dwRandomNum[host] >= dwRandomNum[guest]) | |
| dwRandomNum[host]++; | |
| // If Host opened Car door, try again | |
| if(dwRandomNum[host] == dwRandomNum[car]) | |
| { | |
| Selecting = true; | |
| } | |
| else | |
| { | |
| // Guest select door again | |
| dwRandomNum[guest2] %= (MaxDoor - 2); | |
| if(dwRandomNum[guest2] >= dwRandomNum[guest] || | |
| dwRandomNum[guest2] >= dwRandomNum[host]) | |
| dwRandomNum[guest2]++; | |
| if(dwRandomNum[guest2] >= dwRandomNum[guest] && | |
| dwRandomNum[guest2] >= dwRandomNum[host]) | |
| dwRandomNum[guest2]++; | |
| // If correct, | |
| if(dwRandomNum[guest2] == dwRandomNum[car]) | |
| CorrectChanged++; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| cout << endl << "Total : " << TryNum << " tries" << endl; | |
| cout << "If the guest switched the choice : " << CorrectChanged * 100 / TryNum << | |
| "% (" << CorrectChanged << "/" << TryNum << ")" << endl; | |
| cout << "If the guest didn't switch the choice : " << CorrectUnchanged * 100 / TryNum << | |
| "% (" << CorrectUnchanged << "/" << TryNum << ")" << endl; | |
| } | |
| return 1; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment