Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Lottosimulation

Diskussion: Lottosimulation im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Folgende Aufgabe wurde von ]=-antr4xx-=[ eingereicht: Lottosimulation (6 aus 49): Man soll seinen Tipp abgeben können, anschliessend sagt einem das ...

Antwort
Alt 21.01.08, 19:09   #1 (permalink)
Member of Honour
 
Benutzerbild von ivegotmail
 
Registriert seit: 28.05.03
ivegotmail Leistung: Z3
Likes: 1
Standard 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 %
__________________
http://livehabo.hackerboard.de | http://livebb.sourceforge.net
ivegotmail ist offline   Mit Zitat antworten
Alt 22.01.08, 00:19   #2 (permalink)
Copykill
Guest
 
Likes:
Standard

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)
  Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 22.01.08, 14:02   #3 (permalink)
 
Registriert seit: 28.09.07
Kenniej91 Leistung: Facit NTK
Likes: 0
Standard

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?
Kenniej91 ist offline   Mit Zitat antworten
Alt 22.01.08, 14:50   #4 (permalink)
 
Registriert seit: 17.01.08
]=-antr4xx-=[ Leistung: Facit NTK
]=-antr4xx-=[ eine Nachricht über ICQ schicken
Likes: 0
Standard

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
]=-antr4xx-=[ ist offline   Mit Zitat antworten
Alt 04.02.08, 21:58   #5 (permalink)
 
Registriert seit: 04.02.08
Nobbs Leistung: Facit NTK
Likes: 0
Standard

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,"%")
Nobbs ist offline   Mit Zitat antworten
Alt 13.02.08, 15:10   #6 (permalink)
 
Registriert seit: 12.02.08
pipo Leistung: Facit NTK
Likes: 0
Standard 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
pipo ist offline   Mit Zitat antworten
Alt 13.02.08, 21:34   #7 (permalink)
 
Registriert seit: 12.01.07
Scorn07 Leistung: Facit NTK
Likes: 0
Standard 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:

Zitat:
3. Zahl: 39
...
5. Zahl: 39
Scorn07 ist offline   Mit Zitat antworten
Alt 13.02.08, 22:18   #8 (permalink)
 
Registriert seit: 12.02.08
pipo Leistung: Facit NTK
Likes: 0
Standard

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
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
pipo ist offline   Mit Zitat antworten
Alt 14.02.08, 18:45   #9 (permalink)
 
Registriert seit: 11.01.08
shinobo Leistung: Facit NTK
Likes: 0
Standard

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
shinobo ist offline   Mit Zitat antworten
Alt 14.02.08, 18:53   #10 (permalink)
 
Registriert seit: 18.12.05
/etc/shadow Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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.
/etc/shadow ist offline   Mit Zitat antworten
Alt 14.02.08, 19:16   #11 (permalink)
 
Registriert seit: 12.01.07
Scorn07 Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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... .
Scorn07 ist offline   Mit Zitat antworten
Alt 14.02.08, 19:29   #12 (permalink)
 
Registriert seit: 18.12.05
/etc/shadow Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von Scorn07
Zitat:
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.
/etc/shadow ist offline   Mit Zitat antworten
Alt 14.02.08, 20:00   #13 (permalink)
 
Registriert seit: 12.01.07
Scorn07 Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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.
Scorn07 ist offline   Mit Zitat antworten
Alt 14.02.08, 21:51   #14 (permalink)
Moderator
 
Benutzerbild von xeno
 
Registriert seit: 09.09.04
xeno Leistung: 8086xeno Leistung: 8086
xeno eine Nachricht über ICQ schicken
Likes: 65
Standard

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;
}
xeno ist gerade online   Mit Zitat antworten
Alt 15.02.08, 14:55   #15 (permalink)
 
Registriert seit: 29.01.06
xsheep Leistung: Facit NTK
Likes: 0
Standard

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;

        }

    }

}
xsheep ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Lottosimulation
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61