Codeoptimierung

Slazer

Mitglied
Hallo,
Ich versuche ein Simulationsprogramm zu einem Glücksspiel zu schreiben.
Dabei handelt es sich nicht um 6 aus 49 wie beim Lotto sondern um 10 aus 70.
Ich lasse mir jede mögliche Kombination über eine rekursive Funktion generieren und schau dann ob ich damit was gewinnnen würde.
Mein Problem:
Das Programm läuft zu langsam und ich habe mir errechnet das es mehrere tausend Jahre braucht bis es fertig ist!
Jetzt frage ich mich ob ich die Sache falsch angegangen bin oder ob ich mich mit der Realität zufrieden geben muss.
Könnt ihr mir weiterhelfen?
mfg Slazer
 
Zuletzt bearbeitet:
moin


Wie soll dir irgendjemand helfen wenn die einzige Angabe ist das du das Rekursiv gelöst hast?


mfg
umbrasaxum
 
Code:
#include <stdio.h>

//Vergleicht die Zahlen und rechnet Gewinn aus
check(int *zahlen, long long *zaehler, long long *summe)
{
	int i, richtig;

	richtig = 0;
	for(i = 0; i < 10; i++)
		if(zahlen[i] <= 10)
			richtig++;

	switch(richtig)
	{
	case 0:
		*summe += 2;
		break;		
	case 5:
		*summe += 2;
		break;
	case 6:
		*summe += 5;
		break;
	case 7:
		*summe += 15;
		break;
	case 8:
		*summe += 100;
		break;
	case 9:
		*summe += 1000; 
		break;
	case 10:
		*summe += 100000;
		break;
	default:
		break;
	}

	(*zaehler)++;
	if((*zaehler % 1000000) == 0) printf("1");
	fflush(stdout);

	return;
}

//Moeglichkeiten generieren wenn eine fertig wird vergleich aufgerufen
moeglich(int *zahlen, int nummer, int pos, long long *zaehler, long long *summe)
{
	int i;

	zahlen[nummer] = pos; //Neueste Nummer
	nummer++;

	if(nummer == 10)
	{
		check(zahlen, zaehler, summe);
	}
	else
	{
		for(i = pos+1; i < (70 - 10 + 2 + nummer); i++)
		{
			moeglich(zahlen, nummer, i, zaehler, summe);
		}
	}

	return; 
}

main()
{
	int zahlen[10], i;
	long long zaehler, summe;

	zaehler = 0;
	summe = 0;

	printf("\n---Berechnung Anfang\t---\n");
	for(i = 1; i < (70 - 10 + 2); i++)
	{
		moeglich(zahlen, 0, i, &zaehler, &summe);
	}

	printf("---Berechnung Ende\t---\nMoeglichkeiten: %d\nGewinnchance insgesamt: %f\n", zaehler, summe / zaehler);
}
 
Hi ...

Also ich wüsste jetzt nicht wie (da ich mir eh nicht angeschaut habe WAS der Code macht), aber iterativ wärs garantiert schneller ...

Ansonsten kann ich nur kleine Sachen vorschlagen, die evtl. was bringen könnten ...

Z.B. würd ich in deinen for-Schleifen nicht immer (70 - 10 + 2) ausrechnen sondern gleich 62 hinschreiben ...

Die for-Schleife
Code:
for(i = 0; i < 10; i++)
if(zahlen[i] <= 10)
richtig++;
könntest du ausschreiben ...

Deinen Output brauchst du nicht jedesmal zu flushen, sondern nur wenn du auch was reinschreibst:
statt
Code:
if((*zaehler % 1000000) == 0) printf("1");
fflush(stdout);
lieber
Code:
if((*zaehler % 1000000) == 0)
{
printf("1");
fflush(stdout);
}

Und du könntest deine Variablen, die du bei jedem Funktionsaufruf übergibts global definieren oder als Referenz (hoffentlich ist das richtig) übergeben ...
d.h.
Code:
nicht
moeglich(int *zahlen, int nummer, int pos, long long *zaehler, long long *summe)
{
  ...
  *summe += 2;
  ...
}
sondern
moeglich(int &zahlen,int nummer,int pos,long &zaehler,long &summe)
{
  summe += 2;
}

Probier das mal aus ...

Aber iterativ wäre das auf jeden Fall um EINIGES schneller ...

Gruß
Shai
 
moin


Ich hab noch ein paar Fragen zu deinem Programm:
1. Wie rechnest du den Gewinn aus, bzw. wozu?
2. es dürfen also keine Zahlen doppelt vorkommen?
3. Warum guckst du nciht selbst schnell nach was Iterativ bedeutet?


mfg
umbrasaxum
 
moin


Vielleicht solltest du dich erstmal mit Kombinatorik und Wahrscheinlichkeitsrechnung befassen. Wenn du dabei bist auch gleich mit Permutation.


mfg
umbrasaxum
 
so,
ja ich habe mich bereits mit iterativ befasst und geschaut was es ist.
Ich will berechnen wieviel Verlust ich durchschnittlich mache,
ich habe das auch bereits auf mathematischer Grundlage geschafft, aber
ich will später das programm noch etwas umändern, so dass ich mit miener wahrscheinlichkeitesrechnung dann den kürzeren ziehen werde.
mfg Slazer
 
Zurück