Lottosimulation

Folgende Aufgabe wurde von ]=-antr4xx-=[ eingereicht:

Lottosimulation (6 aus 49):

Man soll seinen Tipp abgeben können, anschliessend sagt einem das Programm, wieviele Richtige man hatte, und rechnet aus, nach wievielen Spielen diese Zahlen hätten kommen können (Zufall).
Wie beim Lotto darf jede Zahl nur 1-mal eingegeben werden und diese muss zwischen 1 und 49 liegen.
Hier ein Durchlauf eines Beispiel Programms von ]=-antr4xx-=[:

Code:
Lotto-Simulation by ]=-antr4xx-=[

1. Zahl eingeben:   12
2. Zahl eingeben:   54
Zahl ist zu gross, bitte nochmals eingeben.
 2. Zahl eingeben:   12
Zahl wurde bereits eingegeben, bitte nochmals eingeben.
 2. Zahl eingeben:   13
3. Zahl eingeben:   45
4. Zahl eingeben:   36
5. Zahl eingeben:   17
6. Zahl eingeben:   19
1. Zahl:                36
2. Zahl:                26
3. Zahl:                39
4. Zahl:                34
5. Zahl:                39
6. Zahl:                26
Übereinstimmung an Position 1   :36
1 Treffer
Nach 134819 Versuchen hat es geklappt;)
Erfolgschancen:   0.000741735 %
 
problem, das ganze Terminiert nicht, in einfachster Form habe ich es eben mal laufen lassen und nach 10 min aus langeweile abgebrochen... Pseudozufall erlaubt??? (ich meine damit alle 13 Millionen Möglichkeiten der reihe nach abgehen, jeder aber mit zufall einen index in der reihenfolge geben)
 
Also ich habe mal folgendes gemacht:
Code:
#include<iostream>
#include<ctime>
#include<cstdlib>

using namespace std;

int main(void)
{
	  srand((unsigned)time(0));
	  char EingabeC=0;
			do
	  {
				  int EingabeN=0;
				  bool NumberIsTaken[49];
				  for(int i=0;i<49;i++)
				  {
							  NumberIsTaken[i]=0;
						}
				  for(int i=0;i<6;i++)
				  {
				     cin>>EingabeN;
				     if(EingabeN<50&&EingabeN>0&&NumberIsTaken[EingabeN-1]==0)
				     {
										  cout<<"Deine "<<i+1<<". Zahl ist die "<<EingabeN<<"\n";
										  NumberIsTaken[EingabeN-1]=1;
									}
									else
									{
										  cout<<"Das geht nicht!\n";
										  i--;
									}
						}
						int Durch=0;
						START:
						Durch++;
						bool NumberIsRight[49];
						short UebrigeZahlen=49;
						for(int i=0;i<49;i++)
						{
							  NumberIsRight[i]=0;
						}
						for(int i=0;i<6;i++)
						{
							  short CountNumber=(rand()%UebrigeZahlen)+1;
							  for(int i2=0;CountNumber>0;i2++)
							  {
												if(NumberIsRight[i2]==0)
												{
												   CountNumber--;
   												if(CountNumber==0)
															{
															   NumberIsRight[i2]=1;
												   }
												}
									}
						}
						int RightOnes=0;
						for(int i=0;i<49;i++)
						{
									if(NumberIsTaken[i]==1&&NumberIsRight[i]==1)
									{
												RightOnes++;
									}
						}
						if(RightOnes<6)goto START;
						cout<<"Du musstest "<<Durch<<" mal spielen um 6 Richtige zu haben!\n"<<
						"mit der Zusatzzahl waere es ca. 43mal so viel!!!\n";
						cin>>EingabeC;
			}while(EingabeC!='0');
			return 0;
}
Das Ganze funzt auch, goto habe ich nur gemacht, weil ich halt schnell eine Wiederholung machen wolte, wird aber denke ich nicht so schlimm sein.
Aber was mich wundert ist das wenn ich das Programm ausführe immer die Zahlen,
also die ANzahl wie oft ich spielen musste immer sehr wenig variieren.
Ist das wirklich auch bei euch so?
 
Also ich habe es folgendermassen gemacht, Bugs will ich aber nich ausschlien.


random.hpp:
Code:
//random.hpp

#ifndef RANDOM_HPP_
#define RANDOM_HPP_

#include <stdlib.h>

class Random
{
 private:
  int rand;
 public:
  Random();
  ~Random();
  int get_random(int max);

};

#endif



random.cpp:
Code:
//random.cpp

using namespace std;

#include <stdlib.h>
#include "random.hpp"
#include <iostream>

Random::Random()
{
  srand(time((time_t *)NULL));
}

Random::~Random()
{

}

int Random::get_random(int max)
{
  //srand(time((time_t *)0));
  rand = ::rand();
  return rand % max;
}



lotto.cpp:
Code:
#include <iostream>
#include "random.hpp"

using namespace std;

int main(void)
{
  int max = 49, i, choice[6], j, count, treffer = 0, versuche = 0;
  bool gotit = false;
  Random rand;
  int zahl;

  cout << "Lotto-Simulation by ]=-antr4xx-=[" << endl << endl;

  for(i = 0; i < 6; i++)
  {
    cout << i + 1 << ". Zahl eingeben:   ";
    cin >> choice[i];

    if(choice[i] > 49)
    {
      cout << "Zahl ist zu gross, bitte nochmals eingeben.\n ";
      i--;
      continue;
    }
      
    for(count = 0; count < i; count++)
    {
      if(choice[i] == choice[count])
      {
	cout << "Zahl wurde bereits eingegeben, bitte nochmals eingeben.\n ";
	i--;
	continue;
      }

      if(choice[i] == 0)
      {
	choice[i] = 49;
      }
    }
  }


  int num[49];

  for(i = 0; i < 6; i++)
  {

    zahl = rand.get_random(max);
    cout << i + 1 << ". Zahl:\t\t" << zahl << endl;
    num[i] = zahl;
  }

  for(i = 0; i < 6; i++)
  {
    for(j = 0; j < 6; j++)
    {
      if(choice[j] == num[i])
      {
	cout << "Übereinstimmung an Position " << i + 1 << "   :"  << choice[j] << endl;
	treffer++;
      }
    }
  }

  cout << treffer << " Treffer" << endl;
  while(!gotit)
  {
    //Sleep(5);                           //to prevent 100% CPU usage
    count = 0;
    for(i = 0; i < 6; i++)
    {
      num[i] = rand.get_random(49);
    }
    
    for(i = 0; i < 6; i++)
    {
      for(j = 0; j < 6; j++)
      {
	if(choice[i] == num[j])
	  count++;
      }
    }
    if(count == 6)
      break;
    versuche++;
  }
  cout << "Nach " << versuche << " Versuchen hat es geklappt;)" << endl;
  cout << "Erfolgschancen:   " << 1.0 / (float)versuche * 100.0 << " %" << endl;

}



gcc-Aufruf:
Code:
g++ -o lotto lotto.cpp random.cpp
 
Hier meine Lösung in Python...
Kann allerdings recht lange dauern bis es 6 richtige erreicht. Bei mir hat es ca 10 min gedauert bis er beim ~8.2 Millionsten Versuch alle richtig hatte.

Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-

# Lotto Programm

import random
import os

def eingabe():            # 6 Zahlen eingeben lassen; inklusive neueingabe bei falschen Werten
    print "Bitte geben sie 6 Zahlen zwischen 1 und 49 ein.\n"
    z = [0] * 6
    j = 0
    while j < len(z):
        z[j] = raw_input("%d. Zahl > " % (j+1))
        try:
            z[j] = int(z[j])
        except:
            print "Zahlen angeben!"
            continue
        if 0 < int(z[j]) < 50:
            i = 0
            count = 0
            while i < j:
                if z[j] == z[i]:
                    count += 1
                i += 1
            if count != 0:
                print "Zahl wurde bereits eingegeben. Gib eine andere Zahl ein!"
            else:
                j += 1
        else:
            print "Zahl muss zwischen 1 und 49 liegen!"
            
    z.sort()
    return z

def ziehen():            # 6 Zahlen per Zufall ziehen
    x = [0] * 6
    i = 0    
    while i < len(x):
        x[i] = random.randint(1,49)        
        j = 0
        count = 0        
        while j < i:
            if x[j] == x[i]:
                count += 1
            j += 1        
        if count == 0:
            i += 1            
    x.sort()        
    return x

def vergleich(z,x):      # Eingegebene und Gezogene Zahlen vergleichen 
    i = 0
    trefges = []    
    while i < len(z):
        count = 0
        j = 0
        treffer = 0        
        while j < len(x):            
            if z[i] == x[j]:
                count += 1
                treffer = z[i]                
            j += 1            
        trefges.append(treffer)
        i += 1    
    k = 0
    tg = []    
    while k < len(trefges):        
        if trefges[k] != 0:
            tg.append(trefges[k])            
        k += 1    
    countg = len(tg)
    return tg, countg

def sechsrichtige(z):    # Solange ziehen bis 6 Richtige erreicht sind
    con = True
    countv = 0
    while con:
        x = ziehen()
        countv += 1
        if z == x:
            con = False
            #os.system("beep")        # Beep wenn 6 Richtige; beep muss installiert sein (unter Ubuntu das Paket "beep")
            return countv        

z = eingabe()
x = ziehen()

richtige, countg = vergleich(z,x)
print "\nGezogene Zahlen: %s\nDu hast %d Richtige! %s" % (x,countg,richtige)
print "\nZiehe solange bis 6 Richtige gezogen wurden..."
versuche = sechsrichtige(z)
chance = 1.0/versuche
print "\nEs wurden %d Versuche gebraucht für 6 Richtige!\nChance beträgt %s %s" % (versuche,chance,"%")
 
Vb

Das ganze hab ich mal in vb als Windows-Anwendung gemacht mit Benutzeroberfläche und einem Button "Button1"
Ja, ich weiß, es wiederholt sich bei mir viel aber vielleicht könnt ihr mir ja tipps geben wie ich das verkürzen kann...
Danke

Code:
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Tip1, Tip2, Tip3, Tip4, Tip5, Tip6, Cnt As Integer
Do Until Tip1 < 50 And Tip1 > 0
Tip1 = InputBox("Bitte geben Sie hier ihren ersten Tip ab:", "Lotto(1/6)", , , )
Loop

Do Until Tip2 < 50 And Tip2 > 0 And Tip2 < Tip1 Or Tip2 >Tip1
Tip2 = InputBox("Bitte geben Sie hier ihren zweiten Tip ab:", "Lotto(2/6)", , , )
Loop

Do Until Tip3 < 50 And Tip3 > 0 And Tip3 <> Tip1 And Tip3 <> Tip2
Tip3 = InputBox("Bitte geben Sie hier ihren dritten Tip ab:", "Lotto(3/6)", , , )
Loop

Do Until Tip4 < 50 And Tip4 > 0 And Tip4 <> Tip1 And Tip4 <> Tip2 And Tip4 <> Tip3
Tip4 = InputBox("Bitte geben Sie hier ihren vierten Tip ab:", "Lotto(4/6)", , , )
Loop

Do Until Tip5 < 50 And Tip5 > 0 And Tip5 <> Tip1 And Tip5 <> Tip2 And Tip5 <> Tip3 And Tip5 <> Tip4
Tip5 = InputBox("Bitte geben Sie hier ihren fünften Tip ab:", "Lotto(5/6)", , , )
Loop

Do Until Tip6 < 50 And Tip6 > 0 And Tip6 <> Tip1 And Tip6 <> Tip2 And Tip6 <> Tip3 And Tip6 <> Tip4 And Tip6 <> Tip5
Tip6 = InputBox("Bitte geben Sie hier ihren sechsten Tip ab:", "Lotto(6/6)", , , )
Loop

Randomize()
Dim Zahl1 As Integer = CInt(Int((49 * Rnd()) + 1))
Dim Zahl2 As Integer = CInt(Int((49 * Rnd()) + 1))
Dim Zahl3 As Integer = CInt(Int((49 * Rnd()) + 1))
Dim Zahl4 As Integer = CInt(Int((49 * Rnd()) + 1))
Dim Zahl5 As Integer = CInt(Int((49 * Rnd()) + 1))
Dim Zahl6 As Integer = CInt(Int((49 * Rnd()) + 1))
If Integer.Equals(Tip1, Zahl1) = True Then
MsgBox("Ihr erster Tip war richtig!", MsgBoxStyle.Information, "Lotto")
Else
MsgBox("Ihr erster Tip war falsch!", MsgBoxStyle.Exclamation, "Lotto")

If Integer.Equals(Tip2, Zahl2) = True Then
MsgBox("Ihr zweiter Tip war richtig!", MsgBoxStyle.Information, "Lotto")
Else
MsgBox("Ihr zweiter Tip war falsch!", MsgBoxStyle.Exclamation, "Lotto")

If Integer.Equals(Tip3, Zahl3) = True Then
MsgBox("Ihr dritter Tip war richtig!", MsgBoxStyle.Information, "Lotto")
Else
MsgBox("Ihr dritter Tip war falsch!", MsgBoxStyle.Exclamation, "Lotto")

If Integer.Equals(Tip4, Zahl4) = True Then
MsgBox("Ihr vierter Tip war richtig!", MsgBoxStyle.Information, "Lotto")
Else
MsgBox("Ihr vierter Tip war falsch!", MsgBoxStyle.Exclamation, "Lotto")

If Integer.Equals(Tip5, Zahl5) = True Then
MsgBox("Ihr fünfter Tip war richtig!", MsgBoxStyle.Information, "Lotto")
Else
MsgBox("Ihr fünfter Tip war falsch!", MsgBoxStyle.Exclamation, "Lotto")

If Integer.Equals(Tip6, Zahl6) = True Then
MsgBox("Ihr sechster Tip war richtig!", MsgBoxStyle.Information, "Lotto")
Else
MsgBox("Ihr sechster Tip war falsch!", MsgBoxStyle.Exclamation, "Lotto")

Cnt = 0

Do Until Integer.Equals(Tip1, Zahl1) = True
Randomize()
Zahl1 = CInt(Int((49 * Rnd()) + 1))
Cnt = Cnt + 1
Loop
MsgBox("Nach " & Cnt & " Versuch(en) hat es geklappt", MsgBoxStyle.Information, "1/6")
Cnt = 0

Do Until Integer.Equals(Tip2, Zahl2) = True
Randomize()
Zahl2 = CInt(Int((49 * Rnd()) + 1)) Cnt = Cnt + 1
Loop
MsgBox("Nach " & Cnt & " Versuch(en) hat es geklappt", MsgBoxStyle.Information, "2/6")
Cnt = 0

Do Until Integer.Equals(Tip3, Zahl3) = True
Randomize()
Zahl3 = CInt(Int((49 * Rnd()) + 1)) Cnt = Cnt + 1
Loop
MsgBox("Nach " & Cnt & " Versuch(en) hat es geklappt", MsgBoxStyle.Information, "3/6")
Cnt = 0

Do Until Integer.Equals(Tip4, Zahl4) = True
Randomize()
Zahl4 = CInt(Int((49 * Rnd()) + 1)) Cnt = Cnt + 1
Loop
MsgBox("Nach " & Cnt & " Versuch(en) hat es geklappt", MsgBoxStyle.Information, "4/6")
Cnt = 0

Do Until Integer.Equals(Tip5, Zahl5) = True
Randomize()
Zahl5 = CInt(Int((49 * Rnd()) + 1)) Cnt = Cnt + 1
Loop
MsgBox("Nach " & Cnt & " Versuch(en) hat es geklappt", MsgBoxStyle.Information, "5/6")
Cnt = 0

Do Until Integer.Equals(Tip6, Zahl6) = True
Randomize()
Zahl6 = CInt(Int((49 * Rnd()) + 1)) Cnt = Cnt + 1
Loop
MsgBox("Nach " & Cnt & " Versuch(en) hat es geklappt", MsgBoxStyle.Information, "6/6")
Cnt = 0
End Sub
End Class
 
RE: Vb

Wenn ich das richtig sehe, dann simuliert dein Code Lotto nicht richtig.
Wenn du als Tip1 zum Beispiel 34 angeben hast und 34 in Zahl2 "gezogen" wird, dann würde dein Programm es nicht als Treffer zählen.

Außerdem können bei der Lottoziehung gleiche Zahlen vorkommen.

Komischer passiert das auch in der Beispielausgabe:

3. Zahl: 39
...
5. Zahl: 39
 
Danke Scorn,
gut dass du mich dauf hingewiesen hast ich hab mich beim coden mehr auf das proramm als auf die regeln konzentriert. Und mit den Do-Loop Schleifen hab ich vorher noch nie gearbitet, deswegen hab ich die an den stellen wo sie nötig gewesen wären nicht eingebaut :rolleyes:
Und es gibt auch nicht an, wann man sechs richtige hätte sondern nur wann man eine Zahl richtig hätte...
dann beachte ich am besten erst die spielregeln bevor da sowas bei rauskommt
 
Oh mein Gott ich bin jetzt im vor letzten Kapitel von dem Buch C++ für Spieleprogrammierer (für Anfänger) und habe bis jetzt alles recht gut verstanden.
Aber ich muss gestehen das ich immer noch nicht in der Lage bin so ein kleines Programm (o.ä. auf dem Schwierigkeitsgrad ) komplett zu schreiben.

Nun frage ich mich , ist das normal ? -.-
Oder vermittelt mir dieses Buch einen ungünstigen Einstieg ?
Wie lerne ich am effizientesten ?


MfG
 
Original von shinobo
Oh mein Gott ich bin jetzt im vor letzten Kapitel von dem Buch C++ für Spieleprogrammierer (für Anfänger) und habe bis jetzt alles recht gut verstanden.
Aber ich muss gestehen das ich immer noch nicht in der Lage bin so ein kleines Programm (o.ä. auf dem Schwierigkeitsgrad ) komplett zu schreiben.

Nun frage ich mich , ist das normal ? -.-
Oder vermittelt mir dieses Buch einen ungünstigen Einstieg ?
Wie lerne ich am effizientesten ?


MfG

Einfach deine denkweise ändern .. jetzt musst du nur als programmierer denken .. :)

versuch doch einfach mal das hier zu implementieren :
zahlen einlesen
zahlen überprüfen (1-->49)
schleife mit counter bis 6
zahlen ramdom generieren
testen ob sie mit den anderen übereinstimmen
ausgeben von treffern
das reicht schon ..

Ich finde es schon blöd, nach wieviel man gewinnen könnte ..
Die schleife muss nicht enden ..
die zahlen werden immer RANDOM generieret bis alle zahlen vorkommen.
wir gehen aber nicht von 1-1-1-1-1-1 bis 46-46-46-46-46-46 .. sonder RANDOM .. es gibt eine höhe wahrscheinlichkeit dass die schleife nicht endet.
 
Original von /etc/shadow

Ich finde es schon blöd, nach wieviel man gewinnen könnte ..
Die schleife muss nicht enden ..
die zahlen werden immer RANDOM generieret bis alle zahlen vorkommen.
wir gehen aber nicht von 1-1-1-1-1-1 bis 46-46-46-46-46-46 .. sonder RANDOM .. es gibt eine höhe wahrscheinlichkeit dass die schleife nicht endet.

Nein, das stimmt so nicht. Die Schleife muss irgendwann zu Ende sein (Nach dem Gesetz der großen Zahlen). Nur die Zahl die daraus entsteht ist halt nicht sehr aussagekräftig... .
 
Original von Scorn07
Original von /etc/shadow

Ich finde es schon blöd, nach wieviel man gewinnen könnte ..
Die schleife muss nicht enden ..
die zahlen werden immer RANDOM generieret bis alle zahlen vorkommen.
wir gehen aber nicht von 1-1-1-1-1-1 bis 46-46-46-46-46-46 .. sonder RANDOM .. es gibt eine höhe wahrscheinlichkeit dass die schleife nicht endet.

Nein, das stimmt so nicht. Die Schleife muss irgendwann zu Ende sein (Nach dem Gesetz der großen Zahlen). Nur die Zahl die daraus entsteht ist halt nicht sehr aussagekräftig... .

Ja.. mit "nicht enden" habe ich eigentlich gemeint daß die Tage/Wochen/Monate dauern könnte.

Die Häufigkeit dass die Zahl 45 bei einem von 1-46 Generator vorkommt, ist theoretisch 1/46 .. Sie kann aber erst nach 46 schritten vorkommen ..
Stell dir mal vor dass die theoretische Häufigkeit dass 6 Zahlen vorkommen bei 1-1-1-1-1-1 bis 46-46-46-46-46-46 ..
6 * 46^46^46^46^46^46
Nach ein paar milliarden von Schritten kommen die 6 zahlen vor .. das ist aber theoretisch ..
Im WorstCase könnte das viel länger dauern.
 
Original von /etc/shadow
Ja.. mit "nicht enden" habe ich eigentlich gemeint daß die Tage/Wochen/Monate dauern könnte.

Die Häufigkeit dass die Zahl 45 bei einem von 1-46 Generator vorkommt, ist theoretisch 1/46 .. Sie kann aber erst nach 46 schritten vorkommen ..
Stell dir mal vor dass die theoretische Häufigkeit dass 6 Zahlen vorkommen bei 1-1-1-1-1-1 bis 46-46-46-46-46-46 ..
6 * 46^46^46^46^46^46
Nach ein paar milliarden von Schritten kommen die 6 zahlen vor .. das ist aber theoretisch ..
Im WorstCase könnte das viel länger dauern.

6 * 46^46^46^46^46^46 ist ein bisschen hoch gegriffen.

Im deutschen Lotto (6 aus 49) gibt es 13983816 mögliche Ziehungen, da (49! / ( 49 - 6)!) / 6! = 13983816.
Das heißt eine Chance von 1/13983816 bei einem Versuch zu treffen. Das ist mir viel zu gering um selbst zu spielen, aber heutige Prozessoren sollten das schaffen. Auch in kurzen Zeiten.
 
bäh das ist so fies, abes es funktioniert. ergebnis sollte recht schnell folgen, mein längstes waren 27millionen versuche.

Code:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{

	// EINGABE
	int zahl[49];	
	int zufall[49];
	int simzufall[49];
	int treffer=0;
	int marke=1;
	long int nochnebloedevariable=0;

	long int durchlauf=0;
	int i=0, j=0, l=0;

	for( i=1; i<=6; i++)
	{
		cout << "Gib die " << i << ". Zahl ein: ";
		cin >> zahl[i];
		
		// GUELTIGKEITSPRUEFUNG
		if( zahl[i] < 1 || zahl[i] > 49 )
		{
			cout << "Die Zahl muss größer als 0 und kleiner als 50 sein!\n";
			i--;
		}

		// UEBERPRUEFUNG AUF DOPPELTE ZAHLEN
		j=0;
		for( j=1; j<=i-1; j++ )
		{
			if( zahl[j] == zahl[i] )
			{
				cout << "Zahl schon vorhanden!\n";
				i--;
			}
		}
	}

	// AUSGABE DER EINGABE *g*
	j=0;
	for( j=1; j<=6; j++ )
	{
		cout << "Die " << j << ". Zahl ist " << zahl[j] << ".\n";
	}

	// ERZEUGUNG VON ZUFÄLLIGEN LOTTOZAHLEN
	cout << "Die Lottozahlen dieser Ziehung lauten: ";
	srand( time( NULL ) );
	l=0;
	for( l=1; l<=6; l++ )
	{
		zufall[l]=1+(rand()%49);
		j=0;
		for( j=1; j<=l-1; j++ )
		{
			if( zufall[j] == zufall[l] )
				l--;
		}
	}

	// LOTTOZAHLEN AUSGEBEN
	j=0;
	for( j=1; j<=6; j++ )
	{
		cout << zufall[j] << " ";
	}
	
	// ZAHLEN VERGLEICHEN
	j=0;
	for( j=1; j<=6; j++ )
	{
		l=0;
		for( l=1; l<=6; l++ )
		{
			if( zahl[j] == zufall[l] )
				treffer++;
		}
	}

	// TREFFERANZAHL
	cout << "\nDu hast " << treffer << " Richtige.\n";
	cout << "Simulation startet ...\n\n";

	// SIMULATION
	for( nochnebloedevariable=1; nochnebloedevariable>0; nochnebloedevariable=1 )
	{
		durchlauf++;
		if( durchlauf == marke * 1000000 )
		{
			cout << durchlauf << " erfolglose Durchläufe.\n";
			cout << "Aktuelle Zahlen sind " << simzufall[1] << " " << simzufall[2] << " " << simzufall[3] << " " << simzufall[4] << " " << simzufall[5] << " " << simzufall[6] << "\n";
			marke++;
		}

		// ZUFALLSTIP ( simzufall[1-6] )
		l=0;
		for( l=1; l<=6; l++ )
		{
			simzufall[l]=1+(rand()%49);
			j=0;
			for( j=1; j<=l-1; j++ )
			{
				if( simzufall[j] == simzufall[l] )
					l--;
			}
		}
		
		// SIM-TIP UND ZIEHUNG VERGLEICHEN
		treffer=0;
		j=0;
		for( j=1; j<=6; j++ )
		{
			l=0;
			for( l=1; l<=6; l++ )
			{
				if( zufall[j] == simzufall[l] )
					treffer++;
				if( treffer == 6 )
				{
					cout << "\n\n6 Richtige nach " << durchlauf << " Durchläufen.\n\n";
					return 0;
				}
			}
		}
	}

	cout << "\n";
	return 0;
}
 
Meine Lösung ist in C geschrieben:

Code:
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <limits.h>

# define MAX 49
# define MIN 1

int doppelt(unsigned int array[], int pos){

    int i;

    for(i=0; i<pos; i++)
        if(array[pos]==array[i])
            return 1;

    return 0;

}

int zufall_ohne_zuruecklegen(unsigned int array[], int groesse, int min, int max){

    int i;

    for(i=0; i<groesse; i++){

        do{

            array[i]=min+rand()%(max-min+1);

        }while(doppelt(array, i));

    }

}

int pruefe(unsigned int array_1[], unsigned int array_2[], int groesse){

    int i, n;
    int treffer;

    for(i=0, treffer=0; i<groesse; i++)
        for(n=0; n<groesse; n++)
            if(array_1[i]==array_2[n])
                treffer++;

    return treffer;

}

int main(){

    int i;
    unsigned long zaehler;
    unsigned int tipp[6], zufall[6];

    for(i=0; i<6; i++){

        printf("%d. Zahl: ", i+1);
        scanf("%d", &tipp[i]);

        if(doppelt(tipp, i) || tipp[i]>MAX || tipp[i]<MIN){

            printf("Zahl ungueltig\n");
            i--;

        }

    }

    srand(time(NULL));
    for(zaehler=0; zaehler<=ULONG_MAX; zaehler++){

        zufall_ohne_zuruecklegen(zufall, 6, MIN, MAX);

        if(pruefe(tipp, zufall, 6)==6){

            printf("6 Treffer nach %d Versuchen, die Wahrscheinnlichkeit liegt bei %.9f%%.", zaehler, (double)1/zaehler);
            return 0;

        }

    }

}
 
Einfach deine denkweise ändern .. jetzt musst du nur als programmierer denken .. smile

versuch doch einfach mal das hier zu implementieren :
zahlen einlesen
zahlen überprüfen (1-->49)
schleife mit counter bis 6
zahlen ramdom generieren
testen ob sie mit den anderen übereinstimmen
ausgeben von treffern
das reicht schon ..

Das stimmt irgendwie denke ich "falsch" , ich muss echt sagen nach so einer Anleitung kommt mir das doch gar nicht mehr so schwer vor.
Ich weiss nur nie wie ich anfangen soll.

Aber danke hat mir geholfen ^^
 
Hab das Teil mal in C# geschrieben bin aba noch anfänger mein prog stil ist vllt noch net so toll ;)

Is aba ohne diese Berechnung der versuche und dieser Chance

Code:
using System;

namespace Lottotip
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			ConsoleKeyInfo ci;
			Random r= new Random();
			int[] zahlen = new int[6];
			int tmp,i,zahl,k=0,l=0,ct=0,vs=0,j;
			string eng;
			int[] lotto = new int[50];
			int[] engg = new int[100];
			int[] enggg = new int[6];
			do{
				k=0;l=0;
				for(i=0; i<zahlen.Length;i++){
					tmp = r.Next(1,49)+1;
					if(Array.IndexOf(zahlen, tmp)==-1){
						zahlen[i] = tmp;
					}
				}
				Array.Sort(zahlen);
				Array.Clear(engg,0,engg.Length);
				Array.Clear(lotto,0,lotto.Length);
				for(i = 0;i < zahlen.Length;i++){
					try{	
						Console.Write("Geben sie die "+(i+1)+".te Zahl ein:");
						eng=Console.ReadLine();
						zahl=Convert.ToInt32(eng);
						enggg[i]=zahl;
						if(Array.IndexOf(engg,zahl)!=-1){
							Console.WriteLine("Die Zahl wurde schon eingegeben");
							i--;
						}
						
						if(zahl<=0 || zahl>=50){
							Console.WriteLine("Die zahl muss zwischen 1 und 49 liegen");
							i--;
						}
						foreach(int z1 in zahlen){
							if(z1==zahl)lotto[z1]=enggg[i];
						}
						k++;
						engg[k]=zahl;
					}
					catch(OverflowException){
						Console.WriteLine("Die zahl muss zwischen 1 und 49 liegen");
						i--;
					}
					catch(FormatException){
						Console.WriteLine("Sie Haben keine Zahl Eingegeben");
						i--;
					}
				}
				Array.Sort(enggg);
				Console.WriteLine("Die Lotto zahlen sind");
				foreach(int z in zahlen)Console.Write(z+" ");
				Console.WriteLine("\nDeine Eingabe War");				
				for(i=0;i<enggg.Length; i++){
					Console.Write(enggg[i]+" ");
				}
				Array.Clear(engg,0,engg.Length);
				foreach(int z in enggg){
					if(Array.IndexOf(lotto,z)!=-1){
						engg[l]=z;
						l++;
					}
				}
				Console.WriteLine("\nSie Haben "+l+" Übereinstimmungen");
				for(i=0; i< l;i++){
					Console.Write("Zahl "+(i+1)+": "+engg[i]+" ");
				}
				Console.WriteLine("\nWollen sie es noch einmal versuchen ?<j>");
				ci=Console.ReadKey(true);
			}while(Char.ToUpper(ci.KeyChar)=='J');
				
		}
	}
}
 
Hallo!

Meine Python Lösung

Code:
#!/usr/bin/env python2.5

import random

def userNums():
    userList = []
    while(len(userList) < 6):
        num = int(raw_input(("%d. Zahl: " % (len(userList)+1))))
        if userList.count(num) > 0:
            print "Zahl schon vorhanden!"
        elif num < 1 or num > 49:
            print "Nur Zahlen zwischen 1 und 49!"
        else:
            userList.append(int(num))
    userList.sort()
    return userList

def lottoNums():   
    lottoList = [ i for i in range(1,50) ] 
    while(len(lottoList) > 6):
        lottoList.remove(random.choice(lottoList))
    lottoList.sort()
    return lottoList
        
def evaluate(userList, lottoList):
    return filter(lambda x: [ i for i in userList if i==x ], lottoList)

def sixHits(userList):
    sixList = []
    count = 0
    while userList != sixList:
        sixList = lottoNums()
        count += 1
    return count
        

print "*** LOTTO ***\n*************\n"

print "Geben Sie Ihre sechs Zahlen ein"
userList = userNums()

print "\nDie Lotto-Zahlen wurden gezogen..."
lottoList = lottoNums()

matches = evaluate(userList, lottoList)
print "Gezogene Zahlen: %s " % (lottoList)
print "Ihre Zahlen: %s" % (userList)
print "Sie haben %d Richtige: %s" % ((len(matches)), matches)

print "\nVersuche fuer 6 Richtige werden ausgewertet"
count = sixHits(userList)
print "Sie haetten %d Versuche gebraucht!" % (count)
print "Das entspricht einer Chance von %s%s!" % (1.0/count*100, "%")

Gruß
Felix
 
So hier mal eine Möglichkeit von mir in C#:

Ist vlt etwas umständlich geschrieben, die randomnumber Klasse hätte man nicht wirklich extra schreiben müssen aber ich wollt einfach =)

Output:
Code:
Bitte geben Sie 6 Nummern zwischen 1 und 49  ein.
1
45
32
2
18
3
Die Nummern währen es gewesen:
13 23 31 32 40 44

Deine Nummern sind diese:
1 2 3 18 32 45

Die folgenden Zahlen sind richtig:
32

randomnumber.cs
Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace lotto
{
    class randomnumber
    {
        private int m_Number;
        private int m_Min;
        private int m_Max;

        private Random random = new Random();


        public void choicenumber()
        {
            
            m_Number = random.Next(m_Min, m_Max);
        }
        public int number
        {
            get
            {
                return m_Number;
            }
        }
        public int min
        {
            get
            {
                return m_Min;
            }
            set
            {
                m_Min = value;
            }
        }
        public int max
        {
            get
            {
                return m_Max;
            }
            set
            {
                m_Max = value;
            }
        }
    }
}
Programm.cs
Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace lotto
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> r_numbers = getrandomnumbers();
            List<int> u_numbers= getusernumbers();
            List<int> matches = getmatches(r_numbers, u_numbers);

            Console.WriteLine("Die Nummern währen es gewesen:");
            WriteTheList(r_numbers);

            Console.WriteLine();

            Console.WriteLine("Deine Nummern sind diese:");
            WriteTheList(u_numbers);

            Console.WriteLine();

            Console.WriteLine("Die folgenden Zahlen sind richtig:");
            if (matches.Count == 0)
            {
                Console.WriteLine("Keine Treffer");
            }
            else
            {
                WriteTheList(matches);
            }
            Console.Read();
        }
        private static List<int> getrandomnumbers()
        {
            List<int> randomnumbers = new List<int>();
            for (int i = 0; i < 6; i++)
            {
                int m_num = getrandomnumber(1, 50);
                if (!randomnumbers.Contains(m_num))
                {
                    //Console.WriteLine(m_num);
                    //Console.WriteLine(i);
                    //Console.WriteLine();
                    System.Threading.Thread.Sleep(1);
                    randomnumbers.Add(m_num);
                }
                else
                {
                    i--;
                }

            }
            randomnumbers.Sort();
            return randomnumbers;
        }
        private static List<int> getusernumbers()
        {
            List<int> usernumbers = new List<int>();
            Console.WriteLine("Bitte geben Sie 6 Nummern zwischen 1 und 49  ein.");
            for (int i = 0; i < 6; i++)
            {
                
                try
                {
                    int n = int.Parse(Console.ReadLine());

                    if (n < 50 && n > 0 && !usernumbers.Contains(n))
                    {
                        usernumbers.Add(n);
                    }
                    else
                    {
                        Console.WriteLine("Bitte geben Sie eine Nummer zwischen 1 und 49 ein. Es darf jede Nummer nur einmal gewählt werden!");
                        i--;
                    }
                }
                catch (FormatException e)
                {
                    Console.WriteLine(e.Message);
                    Console.WriteLine("Bitte geben Sie eine Nummer zwischen 1 und 49 ein!");
                    i--;
                }
            }
            usernumbers.Sort();
            return usernumbers;
        }
        private static int getrandomnumber(int min, int max)
        {
            randomnumber number = new randomnumber();
            number.min = min;
            number.max = max;
            number.choicenumber();
            return number.number;
        }
        private static List<int> getmatches(List<int> randomnumbers, List<int> usernumbers)
        {
            List<int> matches = new List<int>();

            foreach(int i in usernumbers)
            {
                if(randomnumbers.Contains(i))
                {
                    matches.Add(i);
                }
            }
            return matches;
        }
        private static void WriteTheList(List<int> list)
        {
            foreach (int i in list)
            {
                Console.Write(i + " ");
            }
            Console.WriteLine();
        }
    }
}
 
Zurück
Oben