C :: Aufgabe #3

4 Lösungen Lösungen öffentlich

Lotto - Simulation - 6 aus 49

Anfänger - C von Gustl - 25.11.2012 um 16:16 Uhr
Schreiben Sie ein Programm, welches 6 Zahlen zwischen 1 und 49 abfrägt. Danach soll das Programm solange 6 Zufallszahlen berechnen bis alle 6 eingegebenen Zahlen übereinstimmen. Natürlich darf eine Zahl nicht zweimal vorkommen.
Dann soll ausgegeben werden nach wie vielen "Spielen" ein 6er erzielt wurde und wie hoch die Chance auf einen 3er, einen 4er und einen 5er war.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 03.07.2013 um 19:23 Uhr
Quellcode ausblenden C-Code
/****************************************
 * lotto.c    Lotto 6 aus 49
 *
 * OS     :   GNU/Linux
 * compile:   gcc -Wall -o lotto lotto.c
 *
 * devnull    03-07-2013
 ****************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

/*typedef unsigned int uint;*/


/* Zahl im Array? */
int ismember( uint *pa, uint n )
{
	int i;
    for (i=0;i<6;i++,pa++) {
		if (*pa == n) return 1;
    }
    return 0;        
}

/* Zaehlen Richtige */
int count_matches( uint *pdraw, uint *pmark )
{
	int i,nm;
        
    for (i=0,nm=0;i<6;i++,pdraw++) {
		if (ismember(pmark,*pdraw)) nm++;
    }
    return nm;        
}
   
/* Lotozahlen "ankreuzen" */
int do_mark( uint *pmark )
{
	uint* pm=pmark;
    int m=0,num=0,req=0;
    char snum[8];
        
    do {
		do {
			printf(" %d. Zahl: ", m+1 );
            scanf( "%s", snum );
            req++;
            num=atoi(snum);
            if (num < 1 || num >49) {
				printf( "Zahl muss im Bereich 1..49 liegen!\n" );
                num=0;
            }
		} while (num==0);
        if (ismember(pmark,num))
			printf( "Zahl wurde bereits eingegeben!\n" );
        else {
			*pm++=num;
            m++;
        }
    } while (m<6);
    return req;
}

/* Lottozahlen ziehen */
int do_draw( uint *pdraw )
{
    uint* pd=pdraw;
    int m=0,num=0,rnd=0;
        
    do {
		num = rand()%49 + 1;
        rnd++;
        if (!ismember(pdraw,num)) {
			*pd++=num;
            m++;
        }
    } while (m<6);
    return rnd;
}


/* main */
int main( int argc, char **argv )
{
    uint draw[6];  /* Zahlen einer Ziehung */
    uint mark[6];  /* Zahlen eines Tipps   */
    uint cntm[7];  /* Zahlenhaeufigkeiten  */
    uint cdraw=0;
    int cm,n;

    memset( draw,0,6*sizeof(int));
    memset( mark,0,6*sizeof(int));
    memset( cntm,0,7*sizeof(int));

    /* Tipp abgeben */                
    do_mark( mark );
    printf("Ihr Tipp: ");
    for (n=0;n<6;n++) printf("%d ", mark[n]);
    printf("\n");

    /* Seed Zufallsgenerator */                
    srand(time(NULL));

    /* Ziehungen bis 6 Richtige */
    do {
		do_draw( draw );
			cdraw++;
            cm=count_matches(draw,mark);
            cntm[cm]++;
            if (cdraw%1000000==0)
				fprintf(stderr,".");
    } while (cm<6);
        
    /* Ergebnis */
    printf("\nAnzahl Ziehungen:  %d\n",cdraw);
    printf( "Treffer  Anzahl    Häufigkeit[%%]\n" );
    for (n=0;n<=6;n++)
		printf("%4d    %-10d  %9.6f\n", n,cntm[n],(100.*cntm[n])/cdraw);
        
    return 0;
}
vote_ok
von schlemiel (160 Punkte) - 13.11.2015 um 20:03 Uhr
Quellcode ausblenden C-Code
/*
 * lottoanalyse.c
 *
 *  Created on: 12.11.2015
 *      Author: schlemiel
 */

#include <stdio.h>
#include <time.h> 	// wegen srand()
#include <stdlib.h>
#include <unistd.h> // wegen sleep()

//globale Variablen
int inLotto[6];
int randLotto[6];
int anzVersuche;
int anzTreffer[4];
long maxVersuche = 10000000;

//Funktionsköpfe
void loeschen();
void titel();
void menu();
void status();
int arrSort();
int arrCmp();
void eingabe();
void curserSetzen();
void ausgabe();
void zufallsZahlenreihe();
int zahlenVergleich();



//Hauptprogramm
int main(void) {
	menu();
}

void loeschen() { //Bildschirm löschen und Pos 1/1 setzen
	printf("\033[2J");
	printf("\033[1;1H");
}

void titel(){ //Überschrift
	loeschen();
	printf("=====================================\n");
	printf("             Lottozahlen             \n");
	printf("=====================================\n");
}

void menu() {
	int auswahl;
		titel();
		printf("=====================================\n");
		printf("              Auswahl                \n");
		printf("=====================================\n");
		printf("Zahlenreihe 1 selbst eingeben-------1\n");
		printf("Zahlenreihe 1 erstellen lassen------2\n");
		printf("Zahlenreihe 2 erstellen lassen------3\n");
		printf("Automat-(%ld)------------------4\n",maxVersuche);
		printf("-------------------------------------\n");
		printf("Programm Beenden--------------------9\n");
		printf("=====================================\n");
		status();
		scanf("%d", &auswahl);
		switch (auswahl) {
			case 1:
				curserSetzen(20, 1);
				eingabe();
				menu();
				break;
			case 2:
				curserSetzen(20, 1);
				zufallsZahlenreihe(inLotto);
				menu();
				break;
			case 3:
				curserSetzen(20, 1);
				zufallsZahlenreihe(randLotto);
				menu();
				break;
			case 4:
				status();
				int treffer;
				for(long a = 0; a < maxVersuche; a++) {
					zufallsZahlenreihe(randLotto);
					anzVersuche = a+1;
					treffer = zahlenVergleich();
					if(treffer == 6) {
						anzTreffer[3]++;
						break;
					}
					else if(treffer == 3) anzTreffer[0]++;
					else if(treffer == 4) anzTreffer[1]++;
					else if(treffer == 5) anzTreffer[2]++;
					status();
					printf("Trefferanzahl: %d\n", treffer);
				}
				menu();
				break;
			case 9:
				curserSetzen(20,1);
				titel();
				printf("Programm beendet!\n");
				break;
			default:
				curserSetzen(20,1);
				printf("Auswahl nicht möglich!");
				sleep(1);
				menu();
				break;
		}
}

void status() {
	curserSetzen(14,1);
	printf("Status:\n");
	printf("Zahlenreihe 1: ");
	ausgabe(inLotto);
	printf("Zahlenreihe 2: ");
	ausgabe(randLotto);
	printf("Übereinstimmungen: %d x 3 / %d x 4 / %d x 5 / %d x 6\n", anzTreffer[0], anzTreffer[1], anzTreffer[2], anzTreffer[3]);
	printf("Versuche: %d\n", anzVersuche);
	printf("Prozentuale Verteilung: 3 = %.2lf / 4 = %.2lf / 5 = %.2lf\n", ((double)anzTreffer[0]/anzVersuche*100),
			((double)anzTreffer[1]/anzVersuche*100), ((double)anzTreffer[2]/anzVersuche*100));
}

int arrSort(const void *aa, const void *bb) { //Array sortieren
    const int *a = aa, *b = bb;
    return (*a < *b) ? -1 : (*a > *b);
}

int arrCmp(int tmp, int tmp1[6]) { //Arrays vergleichen
	for(int i = 0; i < 6; i++) {
		if(tmp == tmp1[i])
			return 0;
	}
	return 1;
}

void eingabe() { //Zahleneingabe
	int tmp;
	curserSetzen(20,1);
	printf("Bitte 6 Zahlen zwischen 1 und 49 eingeben! "
			"(Eingabe mit Return abschließen)\n");
	for(int i = 0; i < 6; i++) {
		scanf("%d", &tmp);
		if(tmp < 1 || tmp > 49) {
			printf("Zahl liegt nicht zwischen 1 und 49!\n");
			i--;
		}
		else if (arrCmp(tmp, inLotto)==0) {
			printf("Zahl schon vorhanden!\n");
			i--;
		}
		else {
		inLotto[i]=tmp;
		}
	}
}

void zufallsZahlenreihe(int arrZahlen[]) { //6 Zufallszahlen erstellen
	int tmp;
	srand(time(NULL));
	for(int i = 0; i < 6; i++) {
		tmp = rand()%49+1;
		if(arrCmp(tmp, arrZahlen) == 0) {
			i--;
		} else {
			arrZahlen[i] = tmp;
		}
	}
}

void curserSetzen(int a, int b) { //Curser an bestimmte Stelle setzen
	printf("\033[%d;%dH", a, b);
}

void ausgabe(int arr[]) {
	qsort(arr, 6, sizeof(int), arrSort);
	for(int i = 0; i < 6; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int zahlenVergleich() { //gesamte Arrays vergleichen
	int anzahl = 0;
		for(int i = 0; i < 6; i++) {
			for(int j = 0; j < 6; j++) {
				if(inLotto[i] == randLotto[j])
					if(inLotto[i] != 0)
						anzahl++;
			}

		}
		return anzahl;
}

vote_ok
von mraimbot (590 Punkte) - 07.01.2019 um 16:06 Uhr
Quellcode ausblenden C-Code
///////////////////////////////////////////////////////////
//! @file Aufgabe-0003.c
//! @date 07.01.2019
//! @author Sebastian Schröder
//! @details
//! Compiler    : gcc 5.1.0
//! C-FLAGS     : -pipe -std=c99 -Wall -Wextra -pedantic -Werror -D_DEFAULT_SOURCE -O0 -g
//! Testumgebung: Windows 10 - Windows PowerShell
//!
//! Aufgabe: Lotto - Simulation - 6 aus 49
//! Schreiben Sie ein Programm, welches 6 Zahlen zwischen 1 und 49 abfrägt. Danach soll das Programm
//! solange 6 Zufallszahlen berechnen bis alle 6 eingegebenen Zahlen übereinstimmen. Natürlich darf
//! eine Zahl nicht zweimal vorkommen. Dann soll ausgegeben werden nach wie vielen "Spielen" ein 6er
//! erzielt wurde und wie hoch die Chance auf einen 3er, einen 4er und einen 5er war.
///////////////////////////////////////////////////////////


#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


enum ELotto {
	TRIES,
	THREES,
	FOURS,
	FIVES,
};


bool checkLottoNumbers(int *numbers, int size);
void drawLottoNumbers(int *numbers, int size);


int main (/*int argc, char **argv*/) {
	clock_t start_time;
	clock_t current_time;
	unsigned long statistics[4] = { 0 };
	int numbers[6];
	int lotto[6];
	int check = 0;
	char ch;

	srand (time (NULL));

	printf ("--- LOTTO - 6 aus 49 ---\n");
	printf ("Waehle 6 positive Ganzzahlen zwischen inklusive 1 und inklusive 49.\n");
	printf ("Gebe alle 6 Zahlen zusammen ein, getrennt mit einem Leerzeichen oder einem Newline (Enter) (Beispiel: 4 13 7 25 22 49).\n");

	/* Input */

	do {
		printf ("Deine Zahlen: ");
		check = scanf ("%i %i %i %i %i %i", numbers, numbers+1, numbers+2, numbers+3, numbers+4, numbers+5);

		while ((ch = getchar()) != '\n' && ch != EOF);

		if (check != 6) {
			printf ("Eingabefehler: Mindestens einer ihrer 6 Zahlen ist ungueltig oder nicht vorhanden.\n");
			continue;
		}

		for (int i = 0; i < 6; ++i) {
			if (numbers[i] < 1 || numbers[i] > 49) {
				check = 0;
				printf ("Eingabefehler: Mindestens einer ihrer 6 Zahlen liegt nicht innerhalb von [1;49].\n");
				continue;
			}
		}

		if (false == checkLottoNumbers (numbers, 6)) {
			check = 0;
			printf ("Eingabefehler: Mindestens einer ihrer 6 Zahlen kommt doppelt vor.\n");
			continue;
		}

	} while (check != 6);

	start_time = clock ();

	/* Lotto-Play */

	do {
		statistics[TRIES]++;
		check = 0;

		drawLottoNumbers (lotto, 6);

		for (int i = 0; i < 6; ++i) {
			for (int j = 0; j < 6; ++j) {
				if (numbers[i] == lotto[j]) {
					check++;
					break;
				}
			}
		}
		
		if (3 == check) {
			statistics[THREES]++;
		}

		else if (4 == check) {
			statistics[FOURS]++;
		}

		else if (5 == check) {
			statistics[FIVES]++;
		}

		current_time = clock ();

		if ((current_time - start_time) / CLOCKS_PER_SEC >= 1.0f) {
			printf (".");
			start_time = clock ();
		}
	} while (check < 6);

	printf ("\nDu hast den 6er gewonnen!\n");
	printf ("Anzahl Versuche: %11lu\n", statistics[TRIES]);
	printf ("Gewonnene 3er  : %11lu (%10.7f%)\n", statistics[THREES], ((float) statistics[THREES] / (float) statistics[TRIES]) * 100.f);
	printf ("Gewonnene 4er  : %11lu (%10.7f%)\n", statistics[FOURS], ((float) statistics[FOURS] / (float) statistics[TRIES]) * 100.f);
	printf ("Gewonnene 5er  : %11lu (%10.7f%)\n", statistics[FIVES], ((float) statistics[FIVES] / (float) statistics[TRIES]) * 100.f);
	printf ("Gewonnene 6er  : %11lu (%10.7f%)\n", 1L, (1.0f / (float) statistics[TRIES]) * 100.f);

	return EXIT_SUCCESS;
}


bool checkLottoNumbers(int *numbers, int size) {
	int counter = 0;

	for (int i = 0; i < size; ++i) {
		counter = 0;

		for (int j = 0; j < size; ++j) {
			if (numbers[i] == numbers[j]) {
				counter++;
			}
		}

		if (counter > 1) {
			return false;
		}
	}

	return true;
}


void drawLottoNumbers(int *numbers, int size) {
	int check = 0;

	for (int i = 0; i < size; ++i) {
		do {
			numbers[i] = (rand() % 49) + 1;

			check = 0;
			for (int j = 0; j < i; ++j) {
				if (numbers[i] == numbers[j]) {
					check++;
				}
			}
		} while (0 < check);			
	}
}
vote_ok
von kathleenw (3600 Punkte) - 08.07.2020 um 08:16 Uhr
Quellcode ausblenden C-Code
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#include <time.h>
#include <unistd.h>

int zufallszahl()
{
    int zahl,min,max;
    min=1;
    max=49;
    zahl= (rand()%((max+1)-min))+min;
    return zahl;
}

bool ueberpruefe(int zahlen[], int zufallszahl)
{
    int i;
    bool ergebnis;
    

    for (i=0;i<6;i++)
    {
        if (zahlen[i] == zufallszahl)
        {
            ergebnis = true;
            break;
        }
        else
        {
            ergebnis = false;
        }
    }
    
    return ergebnis;
}

int zahlen_stimmen(int zufall[], int zahlen[])
{
    int anzahl_richtige, i, j;
    anzahl_richtige = 0;
    
    for (i=0;i<6;i++)
    {
        for (j=0;j<6;j++)
        {
            if (zufall[i]==zahlen[j])
                anzahl_richtige++;
        }
    }
    
    return anzahl_richtige;
}

double berechne_versuche(double haeufig[])
{
    int anzahl,i;
    anzahl = 0;
    
    for (i=0;i<7;i++)
    {
        anzahl = anzahl + haeufig[i];
    }
    
    return anzahl;
}

int main(void)
{
    int zahlen[] = {1,2,3,4,5,6};
    int zufall[6] = {0};
    int gefunden[6] = {0};
    double haeufigkeit[7] = {0};
    int i, j, auswahl, anzahl_simulationen, richtige;
    double versuche, versuche_gesamt;
    
    srand((unsigned)time(NULL));
    anzahl_simulationen = 1;
    versuche_gesamt = 0;
    
    
    printf("Bitte gebe die Zahlen ein, auf welche du tippen möchtest: \n");
    for (i=0;i<6;i++) {
        printf("%d. Zahl: ", i+1);
        scanf("%d", &zahlen[i]);
        if (zahlen[i]>49 || zahlen[i]<1) {
            printf("Die Zahl muss zwischen 1 und 49 liegen\n");
            --i;
        }
            
    }
    
    
    printf("\nMöchtest du die Wahrscheinlichkeit für einer 3er, 4er, 5er oder 6er berechnen?  ");
    scanf("%d", &auswahl);
    
    for (j=0;j<anzahl_simulationen;j++)
    {
        for (i=0; i<6; i++)
            gefunden[i] = 0;
        for (i=0; i<6; i++)
            haeufigkeit[i] = 0;
        do {
            //Finde 6 unterschiedliche Zufallszahlen
            for (i=0; i<6; i++) {
                zufall[i] = zufallszahl();
                
                if (ueberpruefe(gefunden,zufall[i])==true)
                    --i;
                else {
                    gefunden[i] = zufall[i];
                    //printf("%d, ",zufall[i]);
                }
            }
            
            //Wieviele richtige gibt es?
            richtige = zahlen_stimmen(zufall,zahlen);
            
            //Aufaddieren
            haeufigkeit[richtige] = haeufigkeit[richtige] + 1;
        } while (haeufigkeit[auswahl]==0);
        versuche = berechne_versuche(haeufigkeit);
        printf ("%.0f ",versuche);
        versuche_gesamt=versuche_gesamt + versuche;
    }
    
    printf("\n\nBei einer Simulationen wurden im Schnitt %.0f Ziehungen für einen %der gebraucht.\nDie Wahrscheinlichkeit liegt damit bei %.20f\nEs gibt 104 Ziehungen pro Jahr, damit brauchen sie %.0f Jahre eh sie wahrscheinlich einen %der haben.\n\n",(float)versuche_gesamt/anzahl_simulationen,auswahl,1/((float)versuche_gesamt/anzahl_simulationen),((float)versuche_gesamt/anzahl_simulationen)/104,auswahl);
    
  
    return EXIT_SUCCESS;
}