Hello,
I am new to C++ programming, so I'm still getting a feel for things. I recently wrote a simple C++ program (to be used as a ROOT Macro) to conduct a statistical analysis of a varied version of the Monty Hall problem (code below). Basically, the programs runs a few simple calculations to decide the winner, nothing too complex, and is designed to be run many times for a statistical analysis. What I have noticed is the program uses memory VERY inefficiently. Using Mac Activity Monitor, I notice that when I just loop through 10,000 times my free memory loses ~0.5 gigabytes. This is a program that I want to be able to run at least a million times if not more. Is there some basic error in my code that is causing this? Thanks in advance.
#include "stdint.h"
#include "TMath.h"
#include <cmath>
#include <TRandom1.h>
#include <iostream>
//Varied Monty Hall Program!
//Function to return a random number to serve as a pointer in the 'door_array' array
int RandomDoor(int& doors)
{
TRandom1 *myran=new TRandom1(0,389);
int returnVal=myran->Rndm()*doors;
return returnVal;
}
//Function to Search for an available door
int Search(int* array,int& doors,int& choosedoor,int& host_doors)
{
int returnVal;
if ((doors-host_doors)==1) {
returnVal=choosedoor;
}
int rNum=RandomDoor(doors);
if ((array[rNum]==2)||(rNum==choosedoor)) {
rNum=RandomDoor(doors);
while ((array[rNum]==2)||(rNum==choosedoor)) {
if ((rNum==(doors-1))&&(array[rNum]==2)) {
rNum=0;
}
if ((rNum==(doors-1))&&(rNum==choosedoor)) {
rNum=0;
}
else
{
rNum++;
}
}
returnVal=rNum;
}
returnVal=RandomDoor(doors);
return returnVal;
}
void MontyHall2(int doors, long iterations, int host_doors)
{
double host_wins=0;
double wins=0;
double winpct=0;
//generate array
int* door_array=new int[doors];
//loop through game 'iteratons' times
for (long i=0; i<iterations; i++) {
//populate array with 0's
for (int j=0; j<doors; j++) {
door_array[j]=0;
}
//choose winning door
door_array[RandomDoor(doors)]=1;
//player randomly chooses
int choosedoor=RandomDoor(doors);
//Host randomly chooses doors and turns them to "2"
bool rightVal=false;
for (int k=0; k<host_doors; k++) {
int temp=Search(door_array,doors,choosedoor,host_doors);
door_array[temp]=2;
if (door_array[temp]==1) {
rightVal=true;
}
}
//If host chooses correctly, host_wins++ and game over
if (rightVal==true) {
host_wins++;
}
else {
//Player switches doors
int limit;
if (host_doors>3) {
limit=host_doors/3;
}
else {
limit=1;
}
bool playerwins=false;
for (int n=0; n<limit; n++) {
if (door_array[Search(door_array,doors,choosedoor,host_doors)]==1) {
playerwins=true;
}
}
if (playerwins==true) {
wins++;
}
}
}
winpct=(100*wins)/iterations;
cout<<winpct<<" %"<<endl;
delete[] door_array;
}