Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <random2.h> //place in C:\MinGW\include folder
#define ARRAYSIZE 100
//typedef enum {false, true} bool;
bool checkArray(int currentIndex, int number, int array[]);
bool checkMatch(int arrayInput[], int arrayRandom[], int picks, int amttomatch);
void sort( int array[], int picks);
void print(int array[], int picks);
void switch_print(double loop, double average, double DrawLoopCount, double draw_span);
void printToFile(int array[], double loop, bool match, int picks, int amttomatch);
int roll (int max);
int main() {
bool duplicate;
bool match;
char quit, rml_condition;
int indexR, indexI, input, pick, max;
int inputNumbers[ARRAYSIZE], randomNumbers[ARRAYSIZE], picks, amttomatch, reachMatchLoop;
double loop=0, total=0, average=0, draws=0, DrawLoopCount=1, previous_DrawLoopCount=0, reachMatchLoop_count=0;
double draw_span=0, draw_span_total=0, draw_span_avg=0;
FILE *fp1;// File pointer
//seed random number generator rand
time_t t;
//srand((unsigned) time(&t));
//seed random number generator in random2.h
init_genrand64(time(&t));
printf("Lottery Probability\n\n");
while(quit != 'q'){
//User inputs array of numbers
printf("Enter a max number: ");
scanf("%d", &max);
printf("Set match-attempts (ex. 16 means track amount of times it took 16 or more attempts to reach a match [enter 0 to skip this]: ");
scanf("%d", &reachMatchLoop);
if(reachMatchLoop != 0){
while(rml_condition != 'g' && rml_condition != 'l' && rml_condition != 'e'){
_flushall();
printf("(g)reater than, (l)ess than, or (e)qual to %d: ", reachMatchLoop);
//scanf("%c",&rml_condition);
rml_condition = getchar();
printf("\n");
}
}
printf("How many numbers (from %d) to pick: ", max);
scanf("%d", &picks);
printf("How many numbers to match out of the %d picks: ", picks);
scanf("%d", &amttomatch);
printf("Enter number of draws to perform: ");
scanf("%lf", &draws);
//User inputs random numbers in range of max in amount of numbers to match
printf("\nInput %d numbers from 1 - %d\n", amttomatch, max);
for(indexI=0; indexI<amttomatch; indexI++){
inputNumbers[indexI]=0;
}
//print(inputNumbers,ARRAYSIZE);
for(indexI=0; indexI<amttomatch; indexI++){
do{
printf("Entry%d: ",indexI+1);
scanf("%d", &input);
duplicate = checkArray(indexI,input,inputNumbers);
}while((input<1 || input > max) || duplicate);
inputNumbers[indexI]=input;
}
printf("\n");
//Computer generates array of numbers with no duplicates, and checks picks for a match with input
for(DrawLoopCount=1; DrawLoopCount<=draws; DrawLoopCount++){
match = false;
while(!match){
for(indexR=0; indexR<picks; indexR++){
randomNumbers[indexR]=0;
}
for(indexR=0; indexR<picks; indexR++){
do{
pick = roll(max);
duplicate = checkArray(indexR,pick,randomNumbers);
//printf("%2.0f | %d ", loop,pick);
//printf("dup=%s\n", duplicate ? "true" : "false");
}while(duplicate);
randomNumbers[indexR]=pick;
//printf("%2.0f R=%d\n", loop,pick);
}
match = checkMatch(inputNumbers, randomNumbers, picks, amttomatch);
loop++;
//print(randomNumbers,picks);
//printf("%2.0f ", loop);
//printf("match=%s\n", match ? "true" : "false");
//printToFile(randomNumbers,loop,match,picks,amttomatch);
}
total+=loop;
average = total/DrawLoopCount;
switch(rml_condition) {
case 'g':
if(loop >= reachMatchLoop){
reachMatchLoop_count++;
draw_span = DrawLoopCount-previous_DrawLoopCount;
draw_span_total+=draw_span;
draw_span_avg = draw_span_total/reachMatchLoop_count;
switch_print(loop, average, DrawLoopCount, draw_span);
printf ("Draw Span Avg from %2.0lf attempts per match >= %d: %4.2lf | \n", reachMatchLoop_count, reachMatchLoop,draw_span_avg);
previous_DrawLoopCount = DrawLoopCount;
}
break;
case 'l':
if(loop <= reachMatchLoop){
reachMatchLoop_count++;
draw_span = DrawLoopCount-previous_DrawLoopCount;
draw_span_total+=draw_span;
draw_span_avg = draw_span_total/reachMatchLoop_count;
switch_print(loop, average, DrawLoopCount, draw_span);
printf ("Draw Span Avg from %2.0lf attempts per match <= %d: %4.2lf | \n", reachMatchLoop_count, reachMatchLoop,draw_span_avg);
previous_DrawLoopCount = DrawLoopCount;
}
break;
case 'e':
if(loop == reachMatchLoop){
reachMatchLoop_count++;
draw_span = DrawLoopCount-previous_DrawLoopCount;
draw_span_total+=draw_span;
draw_span_avg = draw_span_total/reachMatchLoop_count;
switch_print(loop, average, DrawLoopCount, draw_span);
printf ("Draw Span Avg from %2.0lf attempts per match = %d: %4.2lf | \n", reachMatchLoop_count, reachMatchLoop,draw_span_avg);
previous_DrawLoopCount = DrawLoopCount;
}
break;
default:
printf ("Attempts: %10.0lf | ", loop);
printf ("Average: %11.2lf | ", average);
printf ("Draw Counter: %0.0lf\n", DrawLoopCount);
break;
}
loop=0;
}
fp1 = fopen("matchAnyPartial.txt", "a");
fprintf (fp1,"%d/%-4d", picks, max);
fprintf (fp1,"Average Attempts: %11.2lf ", average);
fprintf (fp1,"Loop Count: %4.0lf ", DrawLoopCount-1);
fprintf (fp1,"Match Picks: %2d\n", amttomatch);
fclose (fp1);
printf("\n");
printf("Your Numbers:");
sort(inputNumbers,amttomatch);
print(inputNumbers,amttomatch);
printf("\n");
printf("Matched Numbers %d of %d:", amttomatch, picks);
sort(randomNumbers,picks);
print(randomNumbers,picks);
printf("\n");
loop=0;
total=0;
average=0;
reachMatchLoop=0;
reachMatchLoop_count=0;
DrawLoopCount=1;
previous_DrawLoopCount=0;
rml_condition='\0'; //clear char variable
draw_span=0;
draw_span_total=0;
draw_span_avg=0;
printf ("Hit enter to go again. Hit 'Q' to exit\n");
_flushall();
quit = getchar();quit=tolower(quit);
}
return 0;
}
/* Compare input array with rand array for a match */
bool checkMatch(int arrayInput[], int arrayRandom[], int picks, int amttomatch){
int indexR=0, indexI=0, amount=0;
bool match;
//printf("Check for match\n");
//print(arrayInput,amttomatch);
//printf("\n");
//print(arrayRandom,picks);
for(indexR; indexR<picks; indexR++){
for(indexI; indexI<amttomatch; indexI++){
if (arrayRandom[indexR] != arrayInput[indexI]){
//printf("%d | %d\n", arrayRandom[indexR], arrayInput[indexI]);
match = false;
} else{
//printf("%d = %d\n", arrayRandom[indexR], arrayInput[indexI]);
amount++;
}
}
//printf("match=%s\n", match ? "true" : "false");
//printf("dup=%s\n", duplicate ? "true" : "false");
indexI=0;
}
if(amount==amttomatch){
match = true;
}
//printf("%d | %d | ", amount, amttomatch);
//printf("match=%s\n", match ? "true" : "false");
return match;
}
/* Check an array while being created to prevent duplicate entries */
bool checkArray(int currentIndex, int number, int array[]){
int index;
for(index=0;index<=currentIndex;index++){
if (array[index]==number){
//printf("%d = %d\n", array[index], number );
return true;
}
}
return false;
}
void print(int array[], int picks){
int index = 0;
puts("");
for(index; index<picks; index++){
printf("Number%d: %d\n",index+1,array[index]);
}
}
void switch_print(double loop, double average, double DrawLoopCount, double draw_span){
printf ("Attempts: %10.0lf | ", loop);
printf ("Overall Average: %11.2lf | ", average);
printf ("Draw Counter: %10.0lf | ", DrawLoopCount);
printf ("Draw Span: %10.0lf | ", draw_span);
}
void printToFile(int array[], double loop, bool match, int picks, int amttomatch){
int index = 0;
FILE *fp2;
//puts("");
fp2 = fopen("matchAnyPartialAttempts.txt", "a");
fprintf (fp2,"Attempts: %.0lf\n", loop);
fprintf (fp2,"Match: %d\n", match);
fprintf (fp2,"Match Picks: %2d\n", amttomatch);
for(index; index<picks; index++){
fprintf(fp2,"Number%d: %d\n",index+1,array[index]);
}
fprintf (fp2, "\n");
fclose (fp2);
}
void sort( int array[], int picks){
int index, temp, pass, limit;
index = picks;
limit = picks-2;
for (pass=1;pass<=picks-1;++pass){
for(index=0;index<=limit;++index){
if (array[index]>array[index+1]){
temp=array[index];
array[index]=array[index+1];
array[index+1]=temp;
}
}
--limit;
}
}
int roll (int max) {
int rmax;
//rmax = rand()%max+1;
rmax = genrand64_int63()%max+1;
return rmax;
}