Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[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.

Lottostatistik

Diskussion: Lottostatistik im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Eingereicht von pi() Es handelt sich um ein Lotto-Programm.Man kann am Anfang seinen Tipp eingeben und dann wie viele ...

Antwort
Alt 08.06.07, 13:23   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard Lottostatistik

Anzeige

Eingereicht von pi()


Es handelt sich um ein Lotto-Programm.Man kann am Anfang seinen Tipp eingeben und dann wie viele Lottoscheine (Durchläufe) man haben will.Als Ergebnis sollte eine Statistik herauskommen, die wie folgt aussehen sollte:

Statistik:
nieten:3455140
einser:3404654
zweier:1134126
dreier:157049
vierer:8840
fünfer:191
sechser:0

Es dürfen natürlich auch Zahlen doppelt getippt werden und Die Reihenfolge spielt keine Rolle.
In diesem Fall habe ich 8160000 Durchläufe gemacht (~Anzahl Österr. Einwohner) und Lotto 6 aus 45 (Österreichisches Lotto, da weniger Einwohner).Ihr könnt es natürlich deutsch machen (oder so wie er es in dem Land woher der jeweilige Programmierer kommt eben hat mit den Einwohnern und der Wahrscheinlichkeit.

__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 08.06.07, 14:37   #2 (permalink)
 
Registriert seit: 25.06.06
0wnZ Leistung: Facit NTK
0wnZ eine Nachricht über ICQ schicken
Likes: 0
Standard

Es sollen also keine Wahrscheinlichkeiten ausgerechnet werden ?
Nur z.B. ne while Schleife machen und solange Zahlen ziehen bis alle Lotto-Scheine benutzt wurden sind ?
0wnZ ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 09.06.07, 20:54   #3 (permalink)
 
Benutzerbild von mauralix
 
Registriert seit: 17.04.06
mauralix Leistung: 8086
Likes: 3
Standard

In Österreich gibt es dann auch noch die Zusatzzahl. Außerdem sollte man gleich eingeben können wieviele Personen einen Lotteschein kaufen. Nicht jeder Österreicher kauft einen, manche dafür gleich 10^^
mauralix ist gerade online   Mit Zitat antworten
Alt 09.06.07, 21:08   #4 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Da sich der Aufgabeneinsender nicht meldet:

So wie ich die Aufgabe verstehe, sollte man das ganze für einen Tipp simulieren. Da spielt es keine Rolle, wieviele den Schein kaufen

Ich würde sagen, man könnte eigentlich die vollständigen Regeln simulieren (Zusatzzahl etc). Also: Benutzer gibt seinen Tipp ab und wie viele Ziehungen simuliert werden sollten - das Programm gibt dazu ein paar Statistiken aus. Dabei sollte man nicht mit Wahrscheinlichkeiten rumrechnen sondern einfach mal jede Ziehung wirklich simulieren .
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 09.06.07, 22:02   #5 (permalink)
 
Registriert seit: 30.03.07
toor.910 Leistung: Facit NTK
Likes: 0
Standard

da keiner was macht hab ich mal schnell was zusammengebaut...

extrem hässlich und lang, aber ich bin ja noch anfänger

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

int main() {

  srand (time(NULL));

  cout << "\t\tL O T T O\n\n";

  int tip[6];
  for (int i=0;i<=5;i++) {
    do {
      cout << "Tip " << i+1 << "/6 eingeben: ";
      cin >> tip[i];
    } while (tip[i] < 1 || tip[i] > 49);
  }

  cout << "\nDurchlaeufe eingeben: ";
  int d;
  cin >> d;

  int ziehung[6];
  int zaehler;
  int _0=0,_1=0,_2=0,_3=0,_4=0,_5=0,_6=0;

  for (int i=0;i<=(d-1);i++) {
    zaehler=0;
    for (int i=0;i<=5;i++) {
      ziehung[i] = rand() % 50;
      for (int j=0;j<=5;j++) {
        if (tip[j] == ziehung[i])
          zaehler++;
      }
    }
    switch (zaehler) {
      case 0: _0++; break;
      case 1: _1++; break;
      case 2: _2++; break;
      case 3: _3++; break;
      case 4: _4++; break;
      case 5: _5++; break;
      case 6: _6++; break;
    }  
  }

  cout << "\nNieten:  " << _0
       << "\nEinser:  " << _1
       << "\nZweier:  " << _2 
       << "\nDreier:  " << _3  
       << "\nVierer:  " << _4
       << "\nFuenfer: " << _5 
       << "\nSechser: " << _6 <<endl;

  cout << "\nby toor.910 ~ Habo 09.06.07 21:50";

  system("PAUSE>NUL");
  return 0;
}
lotto.rar --> reihenfolge berücksichtigt
lotto2.rar --> reihenfolge nicht berücksichtigt
Angehängte Dateien
Dateityp: rar lotto.rar (29,2 KB, 59x aufgerufen)
Dateityp: rar lotto2.rar (29,2 KB, 40x aufgerufen)
toor.910 ist offline   Mit Zitat antworten
Alt 10.06.07, 12:53   #6 (permalink)
 
Registriert seit: 29.04.07
pi() Leistung: Facit NTK
Likes: 0
Standard

So, sry, ich wusste noch nicht, dass meine Aufgabe schon on ist.(Danke)
CDW hat es schon richtig erklärt, also gibt es dazu eigenltich nichts zu sagen.
Happy coding!

PS: Achja sry, die Anzahl der Durchläufe entspricht logischerweise der Anzahl der Ziehungen, nicht der Lottoscheine.
__________________
Seht euch das bitte einmal an.Hab mir echt Mühe gegeben:
Hier: www.gutinmathe.at
pi() ist offline   Mit Zitat antworten
Alt 10.06.07, 13:44   #7 (permalink)
 
Benutzerbild von mauralix
 
Registriert seit: 17.04.06
mauralix Leistung: 8086
Likes: 3
Standard

Zitat:
Man kann am Anfang seinen Tipp eingeben und dann wie viele Lottoscheine (Durchläufe) man haben will.
Bei toor.910 ist es so implementiert, dass man die gleichen Zahlen halt beliebig oft anwendet. (also die Anzahl der Durchläufe)
Dies ist vorallem für Leute interessant die jede Woche den gleichen Tipp spielen und wissen wollen nach wievielen Wochen sie gewinnen werden.

Ich dachte mir das zuerst anders. Nämlich so: Jeder Österreicher spielt Lotte mit zufälligen Zahlen (Quicktipp) und das Programm soll simulieren wieviele Personen einen 3er,4er,5er, 5er mit Zusatzzahl oder 6er haben.
mauralix ist gerade online   Mit Zitat antworten
Alt 11.06.07, 19:42   #8 (permalink)
 
Registriert seit: 25.06.06
0wnZ Leistung: Facit NTK
0wnZ eine Nachricht über ICQ schicken
Likes: 0
Standard

So habe das ganze auch mal realisiert.
Ist in C geschrieben, jedoch ohne Zusatzmöglichkeiten wie Spiel77 oder was es da noch gibt. Da mache ich mich vielleicht später mal ran ^^
Code   
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int tipp[6];
    int null = 0, eins = 0, zwei = 0, drei = 0, vier = 0, fuenf = 0, sechs = 0;
    int lotto[6];
    int gesamt, ziehen;
    int i, x, z;

    
    printf("Wie häufig soll gezogen werden ?\n");
    scanf("%d", &ziehen);
    
    // 6 Zahlen holen 
    for (i = 1; i <= 6; i++) 
    {
        do
        {
              printf("Ihr %d. Tipp: \n", i);
              scanf("%d", &tipp[i]);
              
        } while (tipp[i] < 0 || tipp[i] > 49); 
    }
    // end 6 Zahlen holen    
    
    // durchläufe simulieren
    for (x = 1; x <= ziehen; x++)
    {
        gesamt = 0;
        for (i = 1; i <= 6; i++)
        {
            lotto[i] = 1+(int) (50.0*rand()/(RAND_MAX+1.0)); // bis 50 da 50 exklusive gilt
    
        for (z = 1; z <= 6; z++)
            if (lotto[i] == tipp[z])// da die gezogene folge irrelevant ist muss jede kombination durchprobiert werden
                         gesamt++;      
        }
        
        switch (gesamt){
               case 0: null++;  break; 
               case 1: eins++;  break;
               case 2: zwei++;  break;
               case 3: drei++;  break;
               case 4: vier++;  break;
               case 5: fuenf++; break;
               case 6: sechs++; break; 
               
        }
    } 
    // end durchläufe simulieren 
    
    // Ausgabe
    printf("\nNieten:\t\t%d\n", null);
    printf("Einser:\t\t%d\n",   eins);
    printf("Zweier:\t\t%d\n",   zwei);
    printf("Dreier:\t\t%d\n",   drei);
    printf("Vierer:\t\t%d\n",   vier);
    printf("Fünfer:\t\t%d\n",   fuenf);
    printf("Sechser:\t%d\n",    sechs);
             
}
Danke an Xalon :)


Ich habs auchmal gezipt.

Mit freundlichen Grüßen

0wnZ
Angehängte Dateien
Dateityp: zip lotto.zip (5,6 KB, 39x aufgerufen)
0wnZ ist offline   Mit Zitat antworten
Alt 12.06.07, 00:18   #9 (permalink)
 
Registriert seit: 12.06.07
norm4n Leistung: Facit NTK
Likes: 0
Standard

Hallo,

So, dann mal hier mein Code. Ich habe ehrlich gesagt etwa 2h dafür gebraucht. Bin noch Anfänger. Am meisten hatte mich ein Logikfehler im "Überprüfalgorhytmus", der untersucht ob die Zahl schon einmal gezogen wurde (oder ob eine 0 vorkommt), aufgehalten. Allerdings, ist mir noch nichts eingefallen, dies vollständig zu verhindern. Momentan zieht mein Programm in diesem Fall eine neue Zahl (was allerdings ja nicht heißt, dass die alte nicht drankommen kann). Morgen werde ich testen, ob ich das Problem mit einer While-Schleife umgehen kann.
Dass der Benutzer 2 mal die gleiche Zahl eingibt, wird auch geduldet. Imho sollte derjenige selber merken, wenn er einen Fehler macht (naja, aus Zeitgründen und Nichtwissen auch rausgelassen).
Die "Sonderspiele" (Zusatzzahl, Spiel77, etc.) muss ich auch noch implementieren.

Mein Programm:

CODE   
Code:
#include <time.h>
#include <iostream>
using namespace std;


int main () {

int LottozahlenZiehung[6];
int LottozahlenBenutzer[6];
long int Ziehungen;
int n=0;
int a=0;
long int Treffer = 0;
long int Niete = 0;
long int Drei = 0;
long int Vier = 0;
long int Fuenf = 0;
long int Sechs = 0;
srand(time( NULL ));

cout << "Lottozahlen eingeben:" << endl;

for (int i=0; i<=5; i++) {
	cout << "Zahl " << i+1 << ": ";
	cin >> LottozahlenBenutzer[i];
}

cout << "Bestimme die Anzahl der Ziehungen: ";
cin >> Ziehungen; 

while (a<Ziehungen) {
a++;
Treffer = 0; 
for (n=0; n<=5; n++) { //Lottozahlen generieren
LottozahlenZiehung[n] = rand()%50;
   if (LottozahlenZiehung[n]==0) {LottozahlenZiehung[n] = rand()%50;} //Wenn die Zahl 0 ist, neue ziehen
   for (int x=n; x>0; x--) { 
      if(LottozahlenZiehung[n] == LottozahlenZiehung[n-x]) { //Wenn die Zahl gleich einer Vorgängerzahl ist, neue ziehen
         LottozahlenZiehung[n] = rand()%50; }} 

   for (int k=0; k<=5; k++) { //Lottozahlen mit gewaehlten Zahlen vergleichen
     if (LottozahlenBenutzer[k] == LottozahlenZiehung[n]) { Treffer++; } }  //Wenn richtig, dann 1 Treffer
   
   
}   
   switch (Treffer) {
	case 3: 
	   Drei++;
	   break;
	case 4:
	   Vier++;
           break;
        case 5:
	   Fuenf++;
	   break;
	case 6:
	   Sechs++;
           break;
        default:
	   Niete++; }
}

cout << "Nieten        : " << Niete << endl;
cout << "Drei Richtige : " << Drei << endl;
cout << "Vier Richtige : " << Vier << endl;
cout << "Fuenf Richtige: " << Fuenf << endl;
cout << "Sechs Richige:  " << Sechs << endl;

return 0;
}


Die Ausgabe sieht so aus:
Zahl 1: 23
Zahl 2: 21
Zahl 3: 43
Zahl 4: 40
Zahl 5: 33
Zahl 6: 2
Bestimme die Anzahl der Ziehungen: 80000000
Nieten : 78478366
Drei Richtige : 1436889
Vier Richtige : 82876
Fuenf Richtige: 1865
Sechs Richige: 4

Edit: Habe den Zufallsmechanismus nun so umgeschrieben, dass garantiert niemals die gleiche Zahl in einer Ziehung erscheint. Da der Logarhytmus ziemlich viele unnötige Durchläufe macht geht einiges an Rechenzeit verloren. Dafür ist das Ergebnis deutlich genauer (Wer einen Counter programmiert hat, der zählt, wie oft Zahlen in einer Ziehung mehrfach vorkommen, weiß wovon ich rede).
Wie man mit dem Hammer programmiert:
code2   
Code:
#include <time.h>
#include <iostream>
using namespace std;


int main () {

int LottozahlenZiehung[6];
int LottozahlenBenutzer[6];
long int Ziehungen;
int n=0;
int a=0;
long int Treffer = 0;
long int Niete = 0;
long int Drei = 0;
long int Vier = 0;
long int Fuenf = 0;
long int Sechs = 0;

srand(time( NULL ));

cout << "Lottozahlen eingeben:" << endl;

for (int i=0; i<=5; i++) {
	cout << "Zahl " << i+1 << ": ";
	cin >> LottozahlenBenutzer[i];
}

cout << "Bestimme die Anzahl der Ziehungen: ";
cin >> Ziehungen; 

while (a<Ziehungen) {
a++;
Treffer = 0;

   for (n=0; n<=5; n++) { //Lottozahlen generieren
   LottozahlenZiehung[n] = rand()%50;

      while (LottozahlenZiehung[n]==0) {LottozahlenZiehung[n] = rand()%50;} //Solange die Zahl 0 ist, neue ziehen
      
      for (int x=n; x>0; x--) { 
         for (int f=1; f<=5; f++) {
             for (int y=2; y<=5; y++) {
                for (int l=3; l<=5; l++) {
                   for (int e=4; e<=5; e++) {
                      for (int q=5; q<=5; q++) {
         while(LottozahlenZiehung[n] == LottozahlenZiehung[n-x] || LottozahlenZiehung[n] == LottozahlenZiehung[n-x-f] || LottozahlenZiehung[n] == LottozahlenZiehung[n-x-y] || LottozahlenZiehung[n] == LottozahlenZiehung[n-x-l] || LottozahlenZiehung[n] == LottozahlenZiehung[n-x-e] || LottozahlenZiehung[n] == LottozahlenZiehung[n-x-q]) { //Solange die Zahl gleich einer Vorgängerzahl ist, neue ziehen
         LottozahlenZiehung[n] = rand()%50;}}}}}}}

   for (int k=0; k<=5; k++) { //Lottozahlen mit gewaehlten Zahlen vergleichen
      if (LottozahlenBenutzer[k] == LottozahlenZiehung[n]) { Treffer++; } }  //Wenn richtig, dann 1 Treffer



   
}   
   switch (Treffer) {
	case 3: 
	   Drei++;
	   break;
	case 4:
	   Vier++;
           break;
        case 5:
	   Fuenf++;
	   break;
	case 6:
	   Sechs++;
           break;
        default:
	   Niete++; }
}

cout << "Nieten        : " << Niete << endl;
cout << "Drei Richtige : " << Drei << endl;
cout << "Vier Richtige : " << Vier << endl;
cout << "Fuenf Richtige: " << Fuenf << endl;
cout << "Sechs Richige : " << Sechs << endl;

return 0;
}


Was mich verwundert ist das Ergebnis. Sind die Chancen wirklich so gering bei 100 Ziehungen einen 3er zu bekommen? (also ziemlich 0?) Mal schaun was bei den 80.000.000 rauskommt. Geht noch ein Weilchen.
norm4n ist offline   Mit Zitat antworten
Alt 12.06.07, 14:43   #10 (permalink)
 
Registriert seit: 25.06.06
0wnZ Leistung: Facit NTK
0wnZ eine Nachricht über ICQ schicken
Likes: 0
Standard

Zitat:
Original von CDW
Es dürfen natürlich auch Zahlen doppelt getippt werden[...]
Das hieße, dass du unbedingt zulassen musst, dass n-mal die gleiche Zahl gezogen werden kann.
Das mit dem Prüfen ob die Zahl 0 ist lässt sich auch einfach lösen, indem du einfach zu deiner zufälligen Zahl 1 zuaddierst.
Code:
LottozahlenZiehung[n] = 1 + (int) (50.0 * rand() / (RAND_MAX + 1.0));
PS: hab das bei mir im Code und im Code, der runterladbar ist geändert.

Mit freundlichen Grüßen

0wnZ

edit: ich sehe gerade, dass man das nicht so machen sollte wie ich es oben geschrieben hab ! :o
edit2: alles berichtigt ^^

Also für sauberen Quellcode das bitte ändern.
0wnZ ist offline   Mit Zitat antworten
Alt 12.06.07, 15:14   #11 (permalink)
 
Registriert seit: 12.06.07
norm4n Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von 0wnZ
Das hieße, dass du unbedingt zulassen musst, dass n-mal die gleiche Zahl gezogen werden kann.
Beim Lotto ist das aber nicht so, auch wenn es in der Aufgabe so vorgegeben wird. Dies war nur eine Modifikation meinerseits, da ich die Aufgabe gelöst habe, sie allerdings noch etwas verfeinern wollte.

Für 80.000.000 lautet die Ausgabe:
Lottozahlen eingeben:
Zahl 1: 23
Zahl 2: 21
Zahl 3: 43
Zahl 4: 40
Zahl 5: 33
Zahl 6: 2
Bestimme die Anzahl der Ziehungen: 80000000
Nieten : 79993577
Drei Richtige : 6422
Vier Richtige : 1
Fuenf Richtige: 0
Sechs Richige : 0

Das verwundert mich doch sehr. Irgendwo muss ein Fehler sein
norm4n ist offline   Mit Zitat antworten
Alt 12.06.07, 20:10   #12 (permalink)
 
Benutzerbild von mauralix
 
Registriert seit: 17.04.06
mauralix Leistung: 8086
Likes: 3
Standard

Hier mal österreichisches Lotte 6 aus 45.
Anmerkung: Keinerlei Fehlerüberprüfung bei der Zahleneingabe !


C# Code   

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

namespace Lottozahlen
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Österreichisches Lotto (6 aus 45)");

            int nuller,einser,zweier,dreier,vierer,fuenfer,zusatz,sechser;
            nuller = einser = zweier = dreier = vierer = fuenfer = zusatz = sechser = 0;
            int[] randNumbers = {-1,-1,-1,-1,-1,-1,-1};// 6 + Zusatzzahl
            int[] userNumbers = new int[6]; 
            Random r = new Random();
            int rand=0;
            // keinerlei Fehlerprüfung
            Console.WriteLine("Bitte Ihre Glücksahlen eingeben !");
            int i,j,d;
            for(i=0;i<userNumbers.Length;i++)
            {
                Console.Write("Zahl" + i + ": ");
                userNumbers[i] = int.Parse(Console.ReadLine());
            }

            Console.WriteLine("Durchläufe: ");
            int rounds = int.Parse(Console.ReadLine());

            for (d = 0; d < rounds; d++)
            {
                for (j = 0; j < randNumbers.Length; j++)
                {
                    i = 0;
                    while (i <= j)
                    {
                        rand = r.Next(44) + 1; // Zahl zwischen 1 und 45
                        for (i = 0; i <= j; i++)
                        {
                            // prüfen ob zahl bereits gezogen wurde, also im pottich noch vorhanden ist
                            if (rand == randNumbers[i])
                                break;
                        }
                    }
                    randNumbers[j] = rand;
                }

                int type = 0;
                for (i = 0; i < randNumbers.Length - 1; i++)
                {
                    for (j = 0; j < userNumbers.Length; j++)
                    {
                        if (randNumbers[i] == userNumbers[j])
                        {
                            type++;
                        }
                    }
                }

                // prüfen auf zusatzzahl nur wenn fünf schon richtig sind
                if (type == 5)
                {
                    for (i = 0; i < userNumbers.Length; i++)
                    {
                        if (userNumbers[i] == randNumbers[randNumbers.Length - 1])
                            zusatz++;
                        else fuenfer++;
                    }
                }

                switch (type)
                {
                    case 0: nuller++; break;
                    case 1: einser++; break;
                    case 2: zweier++; break;
                    case 3: dreier++; break;
                    case 4: vierer++; break;
                    case 6: sechser++; break;
                }
            }

            Console.WriteLine("Ergebnisse (ab dreier gibts Geld)");
            Console.WriteLine("nuller: " + nuller);
            Console.WriteLine("einser: " + einser);
            Console.WriteLine("zweier: " + zweier);
            Console.WriteLine("dreier: " + dreier);
            Console.WriteLine("vierer: " + vierer);
            Console.WriteLine("fünfer: " + fuenfer);
            Console.WriteLine("fünfer mit zusatzzahl: " + zusatz);
            Console.WriteLine("sechser: " + sechser);
            Console.ReadKey();
        }
    }
}
mauralix ist gerade online   Mit Zitat antworten
Alt 14.06.07, 14:16   #13 (permalink)
CDW
Moderator
Themenstarter
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

Zitat:
Original von norm4n
Für 80.000.000 lautet die Ausgabe:
Lottozahlen eingeben:
Zahl 1: 23
Zahl 2: 21
Zahl 3: 43
Zahl 4: 40
Zahl 5: 33
Zahl 6: 2
Bestimme die Anzahl der Ziehungen: 80000000
Nieten : 79993577
Drei Richtige : 6422
Vier Richtige : 1
Fuenf Richtige: 0
Sechs Richige : 0

Das verwundert mich doch sehr. Irgendwo muss ein Fehler sein
Zu dem Ergebnis: ich weiß zwar nicht, was Du für einen Compiler benutzt hast, aber hier ist es eigentlich schon ganz gut erklärt:
http://members.cox.net/srice1/random/crandom.html
Zitat:
The ANSI C standard only states that rand() is a random number generator which generates integers in the range [0,RAND_MAX] inclusive, with RAND_MAX being a value defined in stdlib.h, and RAND_MAX being at least 32767. Note that 32767 isn't a very big number. If RAND_MAX is only 32767 then you can probably get only about 20,000 random numbers before the sequence starts to lose its randomness. Note that RAND_MAX may be larger. Check what the value of RAND_MAX is for you.
Das ganze ist auch auf C++ etc. Libs übertragbar - es werden nur so und so viele Zahlen "zufällig" geliefert, danach beginnt sich die Folge zu wiederholen.
In Deinem Fall (wahrscheinlich 32-bit seed value) würde ich auf 2^32 "random()" Aufrufe tippen, bevor das ganze wieder von Anfang an startet. d.h dass Du effektiv nur 4 Mrd Ziehungen durchführst.

Man könnte nun:
a) regelmäßig srand(time) aufurfen
b) "bessere" random Implementierungen suchen, diese haben aber oft den Nachteil, dass sie nicht so schnell arbeiten.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 14.06.07, 21:23   #14 (permalink)
 
Registriert seit: 14.06.07
Bytestream Leistung: Facit NTK
Likes: 0
Standard

Programmiersprache: Python
Version: Lotto 6 aus 45, einmalige Zahl pro Ziehung, keine Zusatzzahl
MD5-Hash: 95a5076ac666af81dcd1c3742af1be42 (fragt nicht...Mir war halt langweilig und jetzt könnt ihr dann überprüfen ob ihr alles richtig kopiert habt. )

Python Version   

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

import random

# Some global things...
INTEGER_EXCEPTION = "Ungültiger Wert. Bitte geben Sie einen gültigen Integer-Wert an."

# Ermittle Durchläufe
while(True):
	try:
		rounds  = int(raw_input("Bitte Anzahl der Durchläufe angeben: "))
		break;
	except ValueError:
		print INTEGER_EXCEPTION
		
		
# Ermittle Tipp		
tip = []
treffer = []
stats = [0,0,0,0,0,0,0]
i = 0
while i < 6:
	try:	
		currentTip = int(raw_input("Bitte geben Sie ihren " +str(i+1)+ ". Tipp an: "))
		if currentTip not in tip:
			if currentTip < 1 or currentTip > 45:
				print "Sie haben zwar eine korrekte Zahl eingegeben, aber das ist Lotto 6 aus 45."
			else:
				tip.append(currentTip)
				i += 1
		else:
			print "Sie haben bereits auf " +str(currentTip)+ " getippt. \n"
	except ValueError:
		print INTEGER_EXCEPTION
		
for i in range(rounds):
	numbers = [0, 0, 0, 0, 0, 0];
	treff = 0;
	for j in range(6):
		chosen = random.randint(0,44)
		if chosen not in numbers:
			numbers[j] = chosen
		else:
			j -= 1
		if chosen in tip:
			treff += 1
	stats[treff] += 1
	
for i in range(len(stats)):
	print "Es gab " +str(stats[i])+ " " +str(i)+"er."


Zu erwähnen ist das ich Python wirklich gar nicht gut kann und das ganze deswegen wohl nicht wirklich perfomant ist. Aber naja ne Skriptsprache kann sowieso nicht so schnell sein.
Bytestream ist offline   Mit Zitat antworten
Alt 22.06.07, 23:38   #15 (permalink)
 
Registriert seit: 12.06.07
norm4n Leistung: Facit NTK
Likes: 0
Standard

Zitat:
In Deinem Fall (wahrscheinlich 32-bit seed value) würde ich auf 2^32 "random()" Aufrufe tippen, bevor das ganze wieder von Anfang an startet. d.h dass Du effektiv nur 4 Mrd Ziehungen durchführst.
4Mrd. würden ja reichen bei 80 Millionen Ziehungen*6 Zahlen. Ich glaube eher, dass der Fehler darin liegt, dass die x-y-z... Routine aus dem Array rausläuft und deswegen Probleme macht. Also wenn von einem Array[6] bei Array[1-5] steht, z.B.
norm4n ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Lottostatistik
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