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; Zitat: Einfach deine denkweise ändern .. jetzt musst du nur als programmierer denken .. smile versuch doch einfach mal das ...

Antwort
Alt 17.02.08, 15:30   #16 (permalink)
 
Registriert seit: 11.01.08
shinobo Leistung: Facit NTK
Likes: 0
Standard


Zitat:
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 ^^
shinobo ist offline   Mit Zitat antworten
Alt 05.05.08, 18:47   #17 (permalink)
 
Registriert seit: 10.01.08
FdDi Leistung: Facit NTK
Likes: 0
Standard

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');
				
		}
	}
}
FdDi ist offline   Mit Zitat antworten
Alt 21.05.08, 03:47   #18 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard

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
Ook! ist offline   Mit Zitat antworten
Alt 30.06.08, 16:12   #19 (permalink)
 
Registriert seit: 30.06.08
ninetyone Leistung: Facit NTK
Likes: 0
Standard

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();
        }
    }
}
ninetyone ist offline   Mit Zitat antworten
Alt 17.07.08, 17:51   #20 (permalink)
 
Registriert seit: 31.03.08
MrSpider Leistung: Facit NTK
Likes: 0
Standard mal in Java

Hab auch mal eins in Java gemacht. rar-archiv mit: jar file und .bat datei zum starten
Angehängte Dateien
Dateityp: rar lotto.rar (11,0 KB, 10x aufgerufen)
MrSpider ist offline   Mit Zitat antworten
Alt 01.11.08, 19:42   #21 (permalink)
 
Registriert seit: 22.10.08
zaibl Leistung: Facit NTK
Likes: 0
Standard

Hier meine Lösung:


Code:
#include <iostream>

using namespace std;

unsigned int leseInteger(void);
void eingabe(unsigned int *);
void generate(unsigned int *);
bool vergleich(unsigned int *, unsigned int *);

int main(void) {
    srand(time(NULL));
    unsigned int zahlen[6], lotto_zahlen[6];
    long int durchlaeufe = 0;
    bool volltreffer;
    cout << "Lotto Simulation v1.0" << endl << endl;
    eingabe(zahlen);
    do {
        generate(lotto_zahlen);
        volltreffer = vergleich(zahlen, lotto_zahlen);
        durchlaeufe++;
        if(durchlaeufe % 1000000 == 0) {
            cout << endl << "Nach " << durchlaeufe/1000000 << " Millionen Durchlaeufen keine Uebereinstimmung" << endl
                 << "aktuelle Zahlen: " << lotto_zahlen[0] << "  " << lotto_zahlen[1] << "  " << lotto_zahlen[2] << "  " << lotto_zahlen[3] << "  " << lotto_zahlen[4] << "  " << lotto_zahlen[5];
        }
    } while(!volltreffer);
    cout << endl << endl << "Nach " << durchlaeufe << " Durchlaeufen gab es einen Sechser" << endl << "aktuelle Zahlen: " << lotto_zahlen[0] << "  " << lotto_zahlen[1] << "  " << lotto_zahlen[2] << "  " << lotto_zahlen[3] << "  " << lotto_zahlen[4] << "  " << lotto_zahlen[5]
         << endl << "Erfolgschancen:   " <<  (1.0f/durchlaeufe * 100.0) << " %" << endl << endl;
    system("pause");
    return 0;
}

bool vergleich(unsigned int *zahlen, unsigned int *lotto_zahlen) {
    unsigned int treffer = 0;
    for(int i=0; i<6; i++) {
        for(int j=0; j<6; j++) {
            if(*(zahlen+i) == *(lotto_zahlen+j)) {
                treffer++;
                break;
            }
        }
    }
    if(treffer == 6) {
        return true;
    }
    return false;
}

void generate(unsigned int *lotto_zahlen) {
    for(int b=0; b<6;b++) {
        *(lotto_zahlen+b) = 0;
    }
    unsigned int gen_zahl;
    bool gen_ok;
    for(int i=0; i<6; i++) {
        do {
            gen_ok = true;
            gen_zahl = (1+rand()%49);
            for(int j=0; j<i; j++) {
                if(*(lotto_zahlen+j) == gen_zahl) {
                    gen_ok = false;
                }
            }
        } while(!gen_ok);
        *(lotto_zahlen+i) = gen_zahl;
    }
}

void eingabe(unsigned int *zahlen) {
    unsigned int zahl_eingabe;
    bool eingabe_ok;
    for(int i=0; i<6; i++) {
        do {
            eingabe_ok = true;
            cout << i+1 << "te Zahl: ";
            zahl_eingabe = leseInteger();
            if((zahl_eingabe >= 50) || (zahl_eingabe <= 0)) {
                eingabe_ok = false;
                cout << "Die Zahl muss zwischen 0 und 50 sein\n";
            }
            for(int j=0; j<i; j++) {
                if(*(zahlen+j) == zahl_eingabe) {
                    eingabe_ok = false;
                    cout << "Diese Zahl gab es bereits\n";
                }
            }
        } while(!eingabe_ok);
        *(zahlen+i) = zahl_eingabe;
    }
}

unsigned int leseInteger(void) {
     unsigned int wert;
     cin >> wert;
     while(cin.fail()) {
          cout << "Fehler bei der Eingabe, bitte nochmal: ";
          cin.clear();
          cin.sync();
          cin >> wert;
    }
    cin.clear();
    cin.sync();
    return wert;
}
zaibl ist offline   Mit Zitat antworten
Alt 02.01.09, 21:50   #22 (permalink)
 
Registriert seit: 26.12.08
Athelstan Leistung: Facit NTK
Athelstan eine Nachricht über ICQ schicken
Likes: 0
Standard

Hier meine Lösung in Ruby:

//edit Gerade in bearbeitung wegen nachfolgenden Posts

//edit 2

hier die berichtigte Lösung:
Code:
puts "\n\nGeben Sie nacheinander 6 Zahlen zwischen 1 und 49 ein:\n\n"
a = []; i = 1; k = 0
while i <= 6
	k = 0
	puts "#{i}. Zahl:"; b = gets.to_i
	a.each { |part|
		if b == part
			k = 1
		end
	}
	if k == 1
		puts "Diese Zahl wurde schon einmal genannt"
	elsif b > 1 && b < 49
		a.push(b); i+= 1
	else
		puts "Diese Zahl liegt nicht im vorgegebenen Zahlenraum"
	end
end
i = 0; j = 1; c = 0; b = []
while a != b
	b = []; j = 1
	while j <= 6
		k = 0; c = (rand(49)+1)
		b.each { |part|
			if part == c
				k = 1
			end
		}
		if k != 1
			b.push(c); j += 1
		end
	end
	puts b.join("\n"); puts "------------"; i += 1
end
puts "Nach #{i} Versuchen hat es geklappt! Gewinnchance: 1/#{i}*100=#{(1/i.to_f)*100}"
Dauert lange, bis 6 richtige herauskommen. Die Zahlenkolonne, die angezeigt wird, sagt nur, dass das Programm läuft, ansonsten würde nichts passieren bis die Lösung gefunden ist, und da weiß man nie, obs noch arbeitet.
Athelstan ist offline   Mit Zitat antworten
Alt 03.01.09, 14:59   #23 (permalink)
 
Registriert seit: 31.03.08
MrSpider Leistung: Facit NTK
Likes: 0
Standard

Ich kenn mich jetzt zwar nicht so mit Ruby aus, aber es sieht aus als ob bei der zufälligen Generierung der Lottozahlen eine Zahl mehrmals vorkommen kann.
Also das zB 1,1,1,4,4,5 eine gültige zufällig generierte Lottozahl ist. Weil es gibt ja keine Überprüfung auf doppelte Zahlen bei der zufälligen Generierung, wie oben wo die Zahlen vom Benutzer eingegeben werde,
MrSpider ist offline   Mit Zitat antworten
Alt 04.01.09, 16:59   #24 (permalink)
 
Registriert seit: 26.12.08
Athelstan Leistung: Facit NTK
Athelstan eine Nachricht über ICQ schicken
Likes: 0
Standard

Hi MrSpider,

du hast natürlich recht, da ist mir wohl ein Fehler unterlaufen. Liegt warscheinlich daran, dass ich das Programm kurz vor dem Aufbruch auf eine spontane LAN-Party geschrieben habe *ausrede*. Ich werde es demnächst mal beheben.
Athelstan ist offline   Mit Zitat antworten
Alt 05.01.09, 14:08   #25 (permalink)
 
Benutzerbild von Stein
 
Registriert seit: 10.10.05
Stein Leistung: Facit NTK
Stein eine Nachricht über ICQ schicken
Likes: 0
Standard

python   
Code:
import random

def get_num():
    a = random.randrange(1,49,1)
    if a in zahlen:
        return get_num()
    return a
def fill():
    global zahlen
    for i in range(6):
        zahlen[i] = get_num()

def richtige():
    count = 0
    global uz
    for i in range(6):
        if uz[i] in zahlen:
            count += 1
    return count

zahlen = [0]*6
uz = [0]*6
fill()

for j in range(6):
    n= int(raw_input("Geben sie eine Zahl ein"))
    while n in uz or n < 0 or n > 49:
        n = int(raw_input("Zahl ungueltig"))
    uz[j] = n

print "Die Lottozahlen von heute:"
for l in range(6):
    print zahlen[l]
print "ihr Tipp:"
for m in range(6):
    print uz[m]
print "Sie haben " + str(richtige())  + " Richtige"
raw_input("Es wird berechnet wieviele Versuche sie fuer einen 6er gebraucht haetten. Enter fuer go")
counter = 1
while richtige() <> 6:
    counter += 1
    print counter
    fill()
__________________
Steinhagelvoll
Stein ist offline   Mit Zitat antworten
Alt 04.03.09, 22:19   #26 (permalink)
 
Registriert seit: 31.01.09
Alopex Leistung: Facit NTK
Likes: 0
Standard

Ich habe mich auch mal dran gesetzt und was erstellt.
Muss dazu sagen das ich noch ziemlicher Anfänger bin und deswegen vielleicht das eine oder andere zu komplizier gemacht habe. (Über Tipps würde ich mich freuen)

Ich frage mich jedoch ob das alles so richtig ist. Bei den Ergebnis wie lange man für 6 Richtige bräuchte kommt bei mir meist irgend was so um die 100000-500000 ich dachte eigentlich man bräuchte mehr Ziehungen bis zu 6 Richtigen

lotto.h   
Code:
#pragma once
#include <vector>

class lotto
{
	int wahl[6], ziehung[6], richtige, ben_ziehungen;
	std::vector<int> zahlen;
public:
	lotto();
	int ziehen();
	void simulation();
};


lotto.cpp   
Code:
#include "lotto.h"
#include <iostream>
#include <time.h>

lotto::lotto()
{
	srand( time( NULL ) );

	for( int i = 1; i <= 49; i++)
	{
		zahlen.push_back(i);
	}

	for( int i = 0; i < 6; i++ )
	{
		std::cout << "Bitte " << i+1 << ". Zahl eingeben!" << std::endl;
		std::cin >> wahl[i];
		if( wahl[i] <= 0 || wahl[i] > 49 )
		{
			std::cout << "Ungültige Zahl! Die Eingabe muss zwischen 1 und 49 liegen." << std::endl;
			i--;
			continue;
		}
		for( int j = 0; j < i; j++ )
		{
			if( wahl[i] == wahl[j] )
			{
				std::cout << "Eingegebene Zahl wurde bereits eingegeben!" << std::endl;
				i--;
				break;
			}
		}
	}
}

int lotto::ziehen()
{
	for( int i = 0; i < 6; i++ )
	{
		ziehung[i] = rand() % 49 + 1;
	}

	richtige = 0;
	for( int i = 0; i < 6; i++ )
	{
		
		for( int j = 0; j < 6; j++ )
		{
			if( wahl[i] == ziehung[j] )
			{
				richtige++;
			}
		}
	}
	return(richtige);
}

void lotto::simulation()
{
	ben_ziehungen = 0;
	do
	{
		ziehen();
		ben_ziehungen++;
	}
	while( richtige != 6 );
	std::cout << "Nach " << ben_ziehungen << " Ziehungen hätten sie gewonnen. ;)" << std::endl;
}


main.cpp   
Code:
#include <iostream>
#include "lotto.h"

using namespace std;

int main()
{
	lotto test = lotto();
	std::cout << "Sie haben " << test.ziehen() << " Richtige!" << std::endl;
	test.simulation();
	system("Pause");
}
Alopex ist offline   Mit Zitat antworten
Alt 09.11.09, 21:34   #27 (permalink)
 
Registriert seit: 06.04.09
Feuerrot Leistung: Facit NTK
Likes: 0
Standard

Hm, etwas unschön, aber es sollte funktionieren:
Code:
# -*- coding: utf-8 -*-
import random
i=0
zae=0
lz=[]
lze=[]
while i<6:
  z=raw_input("Bitte Zahl eingeben:")
  try:
    z=int(z)
    if int(z) and z not in lz and 0<z<50:
      lz+=[z,]
      i+=1
    elif not int(z):
      print "Bitte eine Zahl eingeben!"
    elif z>1 and z>49:
      print "Zahl nicht im Bereich von 1-49!"
    elif z in lze:
      print "Zahl ist schon vorhanden"
    else:
      print "Du hast einen Fehler provoziert!"
  except:
    print "EINE ZAHL!!!!!!"
lzg=random.sample(xrange(1,49),6)
lz.sort()
lzg.sort()
#print lz
#print lzg
for u in lz:
  if u in lzg:
    lze+=[u,]
print str(len(lze)) + " Zahl(en) stimmen überein"
print "Folgende Zahl(en) stimmen überein:", 
for i in lze:
  print i,
while lz != lzg:
  lzg=random.sample(xrange(1,49),6)
  lzg.sort()
  zae+=1
print "Anzahl der Versuche bis zu den sechs Richtigen:", zae
Feuerrot ist offline   Mit Zitat antworten
Alt 22.12.09, 02:07   #28 (permalink)
 
Benutzerbild von Chris_XY
 
Registriert seit: 01.07.05
Chris_XY Leistung: Z3
Likes: 3
Standard

Ada.

Ich habe versucht, es einigermaßen schön hinzubekommen. Ich denke, es ist nicht ganz misslungen.

Die Zufallszahlen bei Ada sucken aber auch. Ich habe extra eine kleine Ausgabe am Ende eingebaut. Nach 140 Milliarden Versuchen habe ich auch abgebrochen, ich denke, da kommt nichts mehr.
Für 5 Richtige geht aber noch was: (252624, 94748, 54495, 252521, 15794 <= Sieht nach guten Zahlen aus)
Deshalb habe ich die Kalkulation der Chance auch gelassen, weil es dazu sowieso nie kommt.

   
Code:
with Ada.Text_IO, Ada.Integer_Text_IO;
with Ada.Numerics.Discrete_Random;

procedure Lotto is

   type Lottoarray is array (1 .. 6) of Positive;
   type Gewinnarray is array (1 .. 6) of Boolean;

   Tipps : Lottoarray;
   Ziehung : Lottoarray;
   Richtige : Gewinnarray;
   Anzahl_Richtige : Natural := 0;
   Neue_Ziehungen : Lottoarray;
   Counter : Natural := 0;

   subtype Rand_Range is Integer range 1 .. 49;
   package RDM is new Ada.Numerics.Discrete_Random (Rand_Range);
   Rdmgen : RDM.Generator;

   function Suche_Richtige
     (Tipps : Lottoarray;
      Ziehung : Lottoarray)
   return Gewinnarray;

   function Suche_Richtige
     (Tipps : Lottoarray; Ziehung : Lottoarray) return Gewinnarray
   is
      Richtige : Gewinnarray := (others => False);
   begin
      for Zaehler1 in Lottoarray'Range loop
         for Zaehler2 in Lottoarray'Range loop
            if Tipps (Zaehler1) = Ziehung (Zaehler2) then
               Richtige (Zaehler2) := True;
            end if;
         end loop;
      end loop;
      return Richtige;
   end Suche_Richtige;

begin

   for Zaehler in Tipps'Range loop
      Ada.Text_IO.Put ("Gib die Zahl Nr. " & Integer'Image (Zaehler) &
        " ein: ");
      Ada.Integer_Text_IO.Get (Tipps (Zaehler));
   end loop;
   Ada.Text_IO.New_Line;
   RDM.Reset (Rdmgen);
   Ziehung := (others => RDM.Random (Rdmgen));

   for Zaehler in Ziehung'Range loop
      Ada.Text_IO.Put ("Ziehung Zahl Nummer" & Integer'Image (Zaehler) &
       ": " & Integer'Image (Ziehung (Zaehler)));
      Ada.Text_IO.New_Line;
   end loop;
   Ada.Text_IO.New_Line;

   Richtige := Suche_Richtige (Tipps, Ziehung);

   for Zaehler in Richtige'Range loop
      if Richtige (Zaehler) then
         Anzahl_Richtige := Anzahl_Richtige + 1;
         Ada.Text_IO.Put ("Richtiger Tipp: " &
           Integer'Image (Ziehung (Zaehler)));
      end if;
   end loop;
   Ada.Text_IO.New_Line;

   Ada.Text_IO.Put ("Du hast" & Integer'Image (Anzahl_Richtige) &
     " Richtige");
   Ada.Text_IO.New_Line;

   while Anzahl_Richtige <= 6 loop
      Neue_Ziehungen := (others => RDM.Random (Rdmgen));
      Anzahl_Richtige := 0;
      Richtige := Suche_Richtige (Tipps, Neue_Ziehungen);
      for Zaehler in Richtige'Range loop
         if Richtige (Zaehler) then
            Anzahl_Richtige := Anzahl_Richtige + 1;
         end if;
      end loop;

      Counter := Counter + 1;
      if Counter mod 10000000 = 0 then
         Ada.Text_IO.Put_Line ("Schon" & Integer'Image (Counter/1000000) &
           " Milliarden Versuche");
      end if;
   end loop;

   Ada.Text_IO.New_Line;
   Ada.Text_IO.Put ("Du hast" & Integer'Image (Counter) &
     " Versuche gebraucht, um 6 Richtige zu bekommen!");
end Lotto;
__________________
The only true thing about religion is
that it's false.
Chris_XY ist offline   Mit Zitat antworten
Alt 23.12.09, 10:23   #29 (permalink)
 
Registriert seit: 30.07.09
lorschy Leistung: Facit NTK
lorschy eine Nachricht über ICQ schicken
Likes: 0
Standard

Habe das ganze mal in Perl geschrieben...

time perl random.pl 42 24 5 18 37 9
Run 2, new Max: 1
Run 7, new Max: 3
Run 1965, new Max: 4
Run 39841, new Max: 5
Run 30886889, new Max: 6

Finished after 30886889 Runs

real 7m18.662s
user 6m51.560s
sys 0m2.970s

time perl random.pl 42 24 5 18 37 9
Run 1, new Max: 1
Run 4, new Max: 2
Run 130, new Max: 3
Run 3085, new Max: 4
Run 61583, new Max: 5
Run 13636092, new Max: 6

Finished after 13636092 Runs

real 3m13.131s
user 3m1.370s
sys 0m1.250s


A Perl Solution   

Code:
use strict;

my @zahlen = @ARGV;
if (scalar @zahlen ne 6) { die "Usage $0 1 2 3 4 5 6\n"; }

foreach (@zahlen) {
    if (($_ > 49) || ($_ < 1)) { die "[ $_ ]Zahl muss zwischen 0 - 49 liegen\n"; }
}

my $max_hits = 0;
my $runs = 0;
my $numbers;
while ($max_hits < 6) {
    $runs++;

    $numbers = &create_rnd(); 
#    foreach (keys %$numbers) { print $_."\t"; }
    my $hits = &match($numbers, @zahlen);

    if ($hits > $max_hits) { 
    $max_hits  = $hits;
    print "Run $runs, new Max: $max_hits\n";
    }
}

print "\nFinished after $runs Runs \n";
exit;


sub create_rnd()
{
        my $numbers; 
    my $range = 49;

    my $c_nr = 0;
    while ($c_nr <=  5) {
            my $n = int(rand($range));
        if (defined $numbers->{$n}) { 
#            print "$n Oops gibts schon\n";
            next; 
        } else {
                  $numbers->{$n} = $c_nr;
            $c_nr++;
        }
    }

    return $numbers;
}


sub match()
{
    my $numbers = shift;
    my @mine    = @_;

    my $hits    = 0;

    foreach (@mine) {
    if (defined $numbers->{$_}) { $hits++; }
    }
    return $hits;
}

exit;
lorschy ist offline   Mit Zitat antworten
Alt 31.10.10, 16:04   #30 (permalink)
 
Benutzerbild von EgoBolle
 
Registriert seit: 31.10.10
EgoBolle Leistung: Facit NTK
Likes: 0
Question Java-Versuch

Hey Leute ich bin ganz neu hier und lerne auch erst seit kurzem Programmieren...
Also ich bringe mir Java selbst bei, brauch ich für die Schule und das seit 2 Monaten, wobei ich selten lerne

Also hier mein Versuch das ganze mit Java zu machen, sicherlich ncoh zu umständlich und auch nicht komplett aber ich bin froh das ich es geschafft habe mein 1. Programm in java zu schreiben


Code:
import java.io.*;



public class LottoSimulation
{
	public static void main (String[] args)
	{
		System.out.println("Willkommen bei Lotto Simulation >>6 aus 49<<");

		int tipp[] = new int [6];
		int richtig = 0;             // wird für Übereinstimmung benötigt

		for (int i=0; i<6; i++)
		{
			tipp[i] = gettipp(i);
			for(int j=0; j<i; j++)
			{
				if(tipp[i]==tipp[j]){
				System.out.println("Sie haben diese Zahl bereits getippt!");
				i--;
				break;
				}
			}
		}
		
		int ergebnis[] = new int [6];
		
		System.out.println("Die Lottoziehung ergab folgendes Ergebnis: ");
		for (int i=0; i<6; i++)
		{
			ergebnis[i] = ziehung();
			for (int j=0; j<i; j++)
			{
				if (ergebnis[i]==ergebnis[j] || ergebnis[i]==0)
				{
				i--;
				break;
				}
			}


			System.out.println(ergebnis[i]);
			
		}

		// Lottotipp wird auf Übereinstimmung getestet:

		for(int i=0; i<6; i++)
		{
			for(int j=0; j<6; j++)
			{
				if (tipp[i]==ergebnis[j]){
				richtig = richtig + 1;
				}
			}
		}
		
		System.out.println("   Sie haben "+richtig+" richtige!");
		if(richtig >= 3){
		System.out.println("Herzlichen Glückwunsch, Sie hätten gewonnen");
		}else{
		System.out.println("Mein Beileid, Sie hätten nichts gewonnen");
		}

	}

	public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

	public static int gettipp(int i)
	{
		int a = 0;
		int b = 0;
		double Tipp = 0;
		double tipp = 0;
		while (a==0)
		{
		Tipp = 0;
		System.out.println("Bitte tippen Sie Ihre "+ (i+1) +". Lottozahl: ");
		String number = new String();
		try{
		number = in.readLine();
     		}
      		catch(IOException e)
        	{
        	System.out.println("Fehler");
        	}
		try{
		tipp = Double.valueOf(number).doubleValue();
        	Tipp = tipp;
        	}
        	catch(Exception e)
        	{
        	System.out.println("Fehler! Sie haben keine akzeptable oder eine Komma-Zahl eingegeben");
		continue;
        	}
		
		if (!(1 <= Tipp && Tipp <= 49)) {          // ! heißt nicht
 		System.out.println("Ihre "+ i +". Lottozahl war nicht im Bereich 1-49");
		}
		else{
		a=1;
		}

		
		}
		return (int)tipp;

	}

	public static int ziehung()
	{
		double zufall = 0;
		int x = 0;
		zufall = Math.random()*49;
		zufall = Math.round( zufall );
		x = (int)zufall;
		return x;
	}
	


}
edit: das ist jetzt der entgültige Java-code der denke ich mal so ziemlich alles berücksichtigt was eigentlich aufgabe war
Bin mir nicht sicher ob ich was an der Wahrscheinlichkeit gepfuscht habe?! Ich glaube 1 und 49 sind unwahrscheinlicher als 2-48 kann das sein? (wegen der rundung bekommen sie ja weniger chance )
Kritik Ist SEHR erwünscht
PS: hab 5 Stunden gebraucht wie gesagt erstes Programm

Geändert von EgoBolle (01.11.10 um 00:01 Uhr) Grund: Entgültiger Code
EgoBolle 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