Hallo zusammen! Brauche Hilfe in Java, bei einem Programm über Lottozahlen (Zufallszahlen). Danke im Voraus schon mal! ?

4 Antworten

Echte Zufallszahlen lassen sich auf einem Computer nicht ohne weiters herstellen, denn ohne Beeinflussung von außen kämen bei einem Programm mit jedem Start immer die selben Zahlen raus. Die einfachste Beeinflussung von außen geht über den Timer, denn dieser läuft unabhängig vom Computer. Wird per Tastendruck eine Zeit angefordert, so liefert der Timer eine Zahl, deren niederwertigen Stellen nicht vorhersehbar sind. Durch Division durch eine Primzahl (z.B. 17) bekommt man eine gute Mischung rein, sodass alle Stellen dieser Zahl gleichermaßen unvorhersehbar sind. Benötigt man nun einen bestimmten Bereich, z.B. 1 bis 49, so dividiert man durch 49 und ermittelt den Rest, der zwischen 0 und 48 liegt. Eine 1 dazugezählt ergibt das gewünschte Ergebnis, eine echte Zufallszahl zwischen 1 und 49.

Wird diese Prozedur mehrmals durchlaufen ohne erneuten Tastendruck dazwischen, so ist nur die erste Ziehung eine echte Zufallszahl, die folgenden Ergebnisse sind jeweils vom vorangegangenen abhängig.

Da beim Ziehen der folgenden Zahlen die zu erwartenden Möglichkeiten reduziert werden,  muss der anfänglich festgelegte Bereich jedesmal angepasst werden (1-48, 1-47, 1-46 usw.). Die bereits gezogenen Zahlen müssen nach der Ziehung aus dem Array entfernt werden und die Lücke durch Nachrücken geschlossen werden. So ein Array lässt sich dann auch für eine graphische Anzeige verwenden.

Inwieweit für so ein Lottoziehungssystem überhaupt echte Zufallszahlen notwendig sind, ist schwer vorherzusagen. Ein von der Normalverteilung abweichendes Prinzip wäre erst nach einer relativ großen Menge an Ziehungen mit statistischen Mitteln nachweisbar.

In den Labors von IBM wurden vor Jahren mal Versuche gemacht, aus dem atmosphärischen Rauschen echte Zufallszahlen zu gewinnen.

In Deiner vorgesehenen Untersuchung der Ergebnisse hinsichtlich Häufigkeit sehe ich keinen Sinn. Denn bei guten Zufallszahlen kommen zwangsläufig bei jeder Untersuchung andere Ergebnisse raus. Bei scheinbaren Zufallszahlen bräuchte man Unmengen von Ziehungen, um eine mögliche Unregelmäßigkeit signifikant nachzuweisen.


um doppelte Zahlen zu vermeiden, musst Du die schon hezogenen Zahlen durchgehen und checken, ob die neue Zahl schon vorhanden ist...
wenn ja wird solange eine neue generiert, bis nicht... :D

für die Statistik musst Du ein Array für die 49 Zahlen erstellen (Index 0 - 48) und dann das Element mit dem Index der jeweils gezogenen Zahl inkrementieren...
das kann etwas verwirrend sein, weil die Zahlen von 1-49 gehen die Indices aber von 0-48...
dann musst Du entweder von der Zahl jeweils 1 abziehen, oder ein Array mit 50 Elementen erstellen (0-49) und die 0 dann vernachlässigen... :D

24

hier mal "eine" Möglichkeit, wie man das realisieren kann...
habe mich auf deinen Code bezogen, sonst hätte ich's wohl etwas anders realisiert... ;)
hoffe, habe da keine Flüchtigkeitsgehler gemacht !!! :D

/** * * Beschreibung * * @version 1.0 vom 21.08.2015 * @author /   
public class ConLotto {
// Anfang
Attribute private static int [] ziehung = new int [6];
Attribute private static int[] statistik = new int[49];
// Ende Attribute
// Anfang Methoden
public static void main(String[] args) {
for (int i=0;i<10 ;i++ ) {
bildeZiehungszahlen();
zeigeZiehungszahlen();
} // end of for
} // end of main

public static void bildeZiehungszahlen () {
  for (int i = 0 ; i < 6 ; i++) {
ziehung [i] = 1+(int)(49Math.random());
// Zahl schon vorhanden?
for(int r = 0; r < i; ++r){
if(ziehung[i] == ziehung[r]{
i--;
break;
}
}
} // end of for

// Statistik erstellen
for(int i = 0 ; i < 6 ; ++i)
++statistik[ziehung[i] - 1];
}
public static void zeigeZiehungszahlen () {
System.out.print (" Ziehung ergab:");
for (int i = 0;i<6 ;i++ ) {
System.out.print(" " + ziehung [i]) ;
} // end of for
System.out.println();
}
public static void anzahlZiehungszahlen () {
System.out.print (" Statistik:\n");
System.out.println();
for(int i = 0 ; i < 49 ; ++i){
System.out.print(" Zahl " + (i + 1) + ": " + statistik[i] + " mal gezogen");
System.out.println();
}
} // Ende Methoden
} // end of class ConLotto
0
24
@JupStrunk

LOL, hab' tatsächlich einen kleinenn Flüchtigkeitsfehler gemacht...
hab' vergessen eine Klammer zu schließen !!! :D
(die runde Klammer am Ende der ersten Zeile hier)

if(ziehung[i] == ziehung[r]){          
i--;
break;
}
0

Ach du liebe Zeit, wer will das lesen?

Es gibt hier extra eine Funktion im Editor mit der man Quelltext besser darstellen kann.

Das erste Problem ist, dass die Zahlen doppelt vorkommen können, und es auch tun.

Du meinst, so wie du es implementiert hast, kommen die Zahlen doppelt vor, was sie aber eigentlich gar nicht sollen? Oder was ist das Problem?

Mein zweites Problem ist, dass ich den Auftrag habe, angeben zu können welche Zahl wie oft gezogen wurde. Dies bezieht sich darauf, dass wir eine Statistik erstellen sollen, welche Zahl wie oft vorkommt, wenn man 1000-mal die 10 Zahlen ziehen lässt

Wenn ich dich richtig verstehe könntest du z.B. ein Array mit 49 Positionen speichern wie oft jede der Zahlen vorgekommen ist.
D.h. nach jedem Aufruf der Zufallsfunktion addierst du in dem Array an Position x eine 1 , falls x(+1) in den Zufallszahlen vorkam.

28

@nutzer131: im GF-editor einen programmcode darzustellen ist praktisch nicht mehr möglich.

bitte programmcode in privatepaste.com o.ä. einstellen.

0
24
@maximilianus7

NICHT MEHR MÖGLICH !?!?! :O

wie habe ich denn den Code hier eingeben können ???
seltsam !!!

2
28
@JupStrunk

es gibt tastsächlich die eine ausnahme: direkt eintippen.

der normale fragesteller möchte aber seinen code per copy & paste hier einstellen und ohne mühsames nacheditieren geht das nicht.
wenn ich eine grössere menge code absetzen möchte, dann teste ich das vorher und möchte es dann auch kopieren und habe dann dasselbe problem.

dann gibt es auch spezielle schwierigkeiten mit html code da die <...> klammern vom GF-editor interpretiert werden.übrigens ist das bekannt, das wurde schon im forum hinreichend diskutiert. einzige reaktion: vor ca 2 monaten wurde es noch schlimmer.

dazu kommt, dass beim eintippen von längeren text es öfters passiert, dass man zwangsweise ausgeloggt wird und alles ist weg.
auch hier habe mir angewöhnt, ausserhalb zu formulieren.

0

Brauche Hilfe bei einem Java Programm. Siehe unten.?

Ich kenne die begriffe "male" nicht und bräuchte das Programm ohne diesem male. Also die Ausgabe soll ein X aus " * " sein. Kann mir jemand helfen dieses programm nur mit schleifen und ohne diesem "male"

package x.zeichnen;

public class XZeichnen {

public static void main(String[] args) {

    int höhe = 5;
    int höhe2 = höhe / 2;
    int shift = höhe % 2; // 0 der 1, je nach gerade/ungerade

    for (int i = 1; i <= höhe; i++) {
        int k = i > höhe2 ? höhe - i + 1 : i;
        // k zur Untersuchung am besten mit System.out.println am Ende der Zeile loggen, 
        // zählt anfangs hoch wie i, ab der Mitte wieder bis auf 1 runter 
        int abstand = höhe2 - k;
        male(k - 1, ' ');
        System.out.print("*");
        if (abstand >= 0) {
            male(abstand * 2 + shift, ' ');
            System.out.print("* ");
        } // wenn nicht, dann ist gerade die Mitte dran
        System.out.println();
    }
}

private static void male(int n, char c) {
    for (int j = 1; j <= n; j++) {
        System.out.print(c);
    }
}

}

...zur Frage

Mit Java Daten zu MySQL Datenbank hinzufügen

Ich habe ein Programm geschrieben, das Primzahlen errechnet. Ich würde diese nun auch gerne in einer MySQL Datenbank abspeichern, weiß aber nicht genau wie ich das anstellen soll (eigentlich habe ich überhaupt keine Ahnung :) ).

Hier das ursprüngliche Programm:

public class Primzahlen {
 public static void main (String[] args) {
  double d1;
  int[] p;
  p = new int[350000000];
  p[0] = 2;
  int a = 0;
  System.out.print("2, ");

  for(int Zahl = 3; Zahl < 2000000000; Zahl++) {

   for(int  b = 0; b < 2000000000; b++) {
    d1 = (double) Zahl/p[b];
    int i1 = (int) d1;
    //System.out.println(d1-i1 + "  Ergebnis " + Zahl+ "/" + p[b] + ": " + d1 + "  Zahl: " + Zahl + "  Divisor:  " + p[b] + "    " + p[0] + p[1] + p[2] + p[3]);

    if ((d1 - i1) == 0.0) {
     //System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + p[b] + " teilbar.");
     break;
    } else {
     if((p[b]*p[b]) > Zahl) {
      System.out.print(Zahl + ", ");
      a++;
      p[a] = Zahl;
      break;

     }
    }
   } 
  }
 }
}

Und hier mein kläglicher Versuch die Zahlen in der Datenbank zu speichern:

import java.sql.Connection;
public class Primzahlen {
 public static void main (String[] args) {
  Connection con = DriverManager.getConnection("jdbc:mysql://localhost:4001?user=schueler&password=0");
  stmt = con.creatStatement();

  double d1;
  int[] p;
  p = new int[1000];
  p[0] = 2;
  int a = 0;
  System.out.print("2, ");

  for(int Zahl = 3; Zahl < 2000; Zahl++) {

   for(int  b = 0; b < 2000; b++) {
    d1 = (double) Zahl/p[b];
    int i1 = (int) d1;
    //System.out.println(d1-i1 + "  Ergebnis " + Zahl+ "/" + p[b] + ": " + d1 + "  Zahl: " + Zahl + "  Divisor:  " + p[b] + "    " + p[0] + p[1] + p[2] + p[3]);

    if ((d1 - i1) == 0.0) {
     //System.out.println(Zahl + " ist keine Primzahl, sie ist durch " + p[b] + " teilbar.");
     break;
    } else {
     if((p[b]*p[b]) > Zahl) {
      System.out.print(Zahl + ", ");
      a++;
      p[a] = Zahl;
      stmt.executeQuery(INSERT INTO schueler_primzahlen.primzahlen (Primzahl Nr. , Wert);
      VALUES (a, Zahl);


      break;

     }
    }
   } 
  }
 }
}

Ich wäre sehr froh, wenn jemand mich von den Qualen des "Herumprobierens" erlösen könnte.

...zur Frage

Java Dreieck aus Sternen in eigener Methode?

Hallo,

ich hab die Aufgabe in Java ein Dreieck aus Sternen auszugeben und dass in einer eigenen Methode. Da ich keine Ahnung habe wie ich das in eine Methode + der main-Methode machen kann hab ich es erstmal nur in der main-Methode gemacht:

package übung6;

import java.util.Scanner;

public class DreieckausSternen {

private static Scanner scan;

public static void main (String[] args){

scan = new Scanner (System.in);
System.out.print("Geben sie die Anzahl der Zeilen an: ");
int x = scan.nextInt();

int leer = x-1;

for (int i = 1;i <= x;i++){
    for (int n = 1;n <= leer;n++){
        System.out.print(" ");
    }
    leer--;
    
    for (int n = 1;n <= i ;n++)
        System.out.print("*"+" ");
        System.out.println();
}

}

}

Kann mir jemand da weiterhelfen?

EDIT:

Die Aufgabenstellung:

Schreiben Sie eine Methode, die ein Dreieck aus Sternen ausgibt. Die Methode soll ein Argument entgegennehmen, das festlegt, wie viele Zeilen ausgegeben werden sollen. In der rechten Abbildung sehen Sie eine Beispielausgabe für 5 Zeilen. Beachten Sie bitte dass zwischen den einzelnen Sternen ein Leerzeichen ausgegeben wird.

...zur Frage

Was möchtest Du wissen?