ich soll ein Würfel 6000000 würfeln und die Werte in einem Array speichern aber wie (totaler Java Anfänger)?

5 Antworten

Mir ist zwar der Sinn dieser Aufgabe nicht bekannt, aber ich könnte mir vorstellen, dass man damit beweisen will, dass man per Programm keine Zufallszahlen erstellen kann. Warum das so ist, ist ganz einfach: Für die Erstellung einer echten Zufallszahl gibt es keinen Algirithmus. Denn jeder wie auch immer geartete Algorithmus würde bei einer Wiederholung immer die gleiche Zahl liefern. Man benötigt einen externen Vorgang, bei dem man zufällig anfallende Zahlen abgreifen kann. Das wäre z.B. der Timer, bei dem man zumindest beim erstenmal eine echte Zufallszahl bekommt. Alle nachfolgenden Zahlen stehen mit den vorangegangen Zahlen im Zusammenhang, wenn kein von außen kommendes Ereignis die Regelmäßigkeit stört. Das könnten parallel laufende Programme sein oder manuelle Eingaben per Tastendruck. Wäre bei einem Neustart des Programmes die erste Zahl gleich einer Zahl aus einem vorangegangenen Lauf, so wären ab dieser Stelle alle folgenden Zahlen ebenfalls gleich. Dagegen gibt es ungewollte Beeinflussung des Programmlaufes, etwa durch parallel laufende andere Programme, die die Laufzeit beeinflussen. In den 70ger Jahren hat IBM Laborversuche gemacht, um aus dem atmosphärischen Rauschen echte Zufallszahlen zu erzeugen, z.B. zum Testen von Rechnerschaltungen und statistischen Verfahren.

Für die praktische Anwendung werden echte Zufallszahlen durch scheinbare Zufallszahlen ersetzt. Man kann mittels Algorithmen Zahlen so bearbeiten, dass ihre Folge auf Anhieb keine erkennbare Regelmäßigkeit zeigt. Für viele Anwendungen ist das ausreichend.

Das Problem bei Deinem Programm wäre, dass die Programmschleife, die die Zufallszahlen erzeugt, in weitgehend regelmäßigem Abstand auf die Randomanweisung des Systems trifft, was eine unerwünschte Regelmäßigkeit bedeutet. Würde man für jeden Schleifendurchlauf eine Unterbrechung einbauen, die per Tastendruck wieder aufgehoben wird, bekäme man echte Zufallszahlen. Bei 6 Mio Zahlen wäre das sicher kein leichtes Unterfangen.

31

Auch wenn diese Antwort schon drei Jahre alt ist, sollte sie nicht unwidersprochen stehen bleiben. Da hat sich jemand viel Mühe gemacht um eine Menge Unsinn zusammenzuschreiben.

Die einzig richtige Aussage ist: Man kann per Algorithmus keine echten Zufallszahlen sondern nur Pseudozufallszahlen erzeugen.

Mit obigem Programm könnte man nicht zeigen, dass die Zahlen nur pseudozufällig sind.

Der Randomgenerator aus der Java-Bibliothek liefert gleichverteilte Zufallszahlen die auf den Bereich 0 bis 1 normiert sind. Die Periode beträgt etwa 2^48, das sind 281 Billionen. Mit jeder Abfrage des Randomgenerators gibt es eine neue Zahl, die nur von der vorherigen Zahl abhängt. Nicht von der seit der letzten Abfrage vergangenen Zeit, so dass man da keine Unterbrechung einbauen muss.

Der Algorithmus ist sehr einfach:

seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)

wobei seed beim Programmstart einmalig aus der Uhrzeit erzeugt wird.

Die Güte des Zufallszahlengenerators ist für Simulationen ausreichend, aber z.B. nicht zur Erzeugung hochsensibler Passwörter.

0
33
@Schachpapa

Wo siehst Du jetzt den Widerspruch, den Du anfangs angekündigt hast, oder anders, wo ist bei meinem Posting was falsch? Es würde mich schon interessieren. Ich habe schon öfter Programmroutinen programmieren müssen, wo ich mich mit solchen Problemen beschäftigen musste und bin eigentlich mit der Materie vertraut. Ich bin aber noch lernfähig.

0
31
@wotan38

Ich nehme die Formulierung "eine Menge Unsinn" zurück. Ich habe mich im Ton vergriffen, Entschuldigung.

An deinem Posting stimmt nicht, dass man mit 6 Millionen pseudozufälligen Würfelzahlen beweisen kann, dass diese nicht zufällig sind. Zumindest nicht mit den Mitteln, die einem Programmieranfänger zur Verfügung stehen.

Vermutlich sollte der Fragesteller nicht 6 Millionen Werte in einem Array speichern, sondern in einem Array der Länge 6 die Häufigkeiten der Würfelwerte von 1 - 6 zählen. Und diese Häufigkeiten liegen sehr nahe dem Erwartungswert von 1 Mio pro Wert.

Tatsächlich falsch ist, dass man zwischen zwei Aufrufen der random() Funktion warten sollte, damit die Zahlen "zufälliger" werden oder dass parallel laufende Voränge im Computer die Zufälligkeit beeinflussen.

0
33
@Schachpapa

zum 1. Punkt.

Mit den Mitteln eines Programmieranfägern sicher nicht, es sind in der Statistik aber Algorithmen dafür verfügbar, sogar auf Taschenrechner.

zum 2. Punkt

Das sehe ich auch so.

zum Punkt 3.

Das bezieht sich sich auf die von mir beschriebene Methode, den Timer als Quelle heranzuziehen, wenn keine Randomfunktion verfügbar ist und ein Algorithmus verwendet wird. Falls verfügbar, kommt es darauf an, wie diese konzipiert ist. Die Idee, bei Wiederholungen auf vorherige Werte aufzubauen ist mir neu. Ich finde sie gut und werde bei Bedarf darauf zurückgreifen. Mein Entwicklungssystem ist schon älter und hat keine Randomfunktion. Danke für den Hinweis.

0
31
@wotan38

Wie macht man das mit den Mitteln eines Taschenrechners? Die 6 Millionen Werte eintippen ist ja schlecht möglich.

Den in Java benutzten "linearen Kongruenzgenerator" habe ich oben schon aufgeschrieben. Etwas detaillierter kann man es in der Doku nachlesen:
https://docs.oracle.com/javase/10/docs/api/java/lang/Math.html#random()

https://docs.oracle.com/javase/10/docs/api/java/util/Random.html

Der müsste relativ einfach nachzustricken sein. Womit entwickelst du?

0

Also, da in der Aufgabenstellung  steht, dass du die Ergebnisse in einem Array speichern sollst kannst du zunächst davon ausgehen, dass du ein geeignetes Array deklarieren musst. Z.B.

byte[] results = new byte[6000000];

Eine geeignete Schleife zum Befüllen des Arrays hast du bereits. Auf ein Element im Array kannst du mit results[index] zugreifen. Wenn du etwas für alle Elemente in einem beliebigen Array arr machen möchtest sieht es in der Regel so aus.

for(int i = 0; i < arr.length; i++) {

      //Mache etwas mit arr[i]

}

Wie du eine Zufallszahl auslost weißt du auch. Von daher hast du eigentlich alles nötige beisammen.

Einfach jede Zahl getrennt für sich zählen. Der Mittelwert für eine Zahl beträgt eine Million. Jetzt kannst in % ausrechnen, wie groß die Abweichung vom Mittelwert im einzelnen ist. Damit hast aber noch keine Aussage über die Verteilung. Denn es könnte ja sein, dass zuerst alle Einsen hintereinander kommen, dann alle Zweier und so fort. Dann könntest auch eine gleichmäßige Häufigkeit feststellen, obwohl es dann keine Zufallszahlen wären. Dazu müsstest noch die einzelnen Abstände zählen und den Mittelwert berechnen und mit dem Sollwert vergleichen.

Was habe ich beim Würfel falsch gemacht?

Ich muss für die Schule einen Würfel machen und er soll die Zahlen die ganze Zeit ausgeben bis eine 6 auftaucht.

public void wuerfelnBis6(){

while ( zufallszahl==6){
     int zufallszahl=(int) ((Math.random()*6)+1);
    System.out.println(zufallszahl);}

Wo ist der Fehler?

...zur Frage

Java:Programm für Würfel

Hallo erstmal! Ich muss ein Java-Programm schreiben,in dem die Funktionen wurf() ,augen() (diese soll spezifisch dazu deinen,den wert als int zurückzugeben) und eine Funktion public static int augensumme(Wuerfel w1, Wuerfel w2) implementiert sind. Ich bin damit auch soweit durch,wollte dann jedoch das Programm testen und habe bemerkt,dass ich die main-methode vergessen habe. Jetzt versuche ich,die Zeile public static void main (String[] args) { hinzuzufügen,sobald ich jedoch die geschweifte Klammer setze,zeigt mir NetBeans massig "illegal start of expression" an. Wie kann ich das vermeiden und mein Programm lauffähig machen?

Hier der Code: import java.math.*; public class Wuerfel {

public int w1;
public int w2;

        public  Wuerfel() {
            wurf();  
        }
        
        public void wurf() {
            w1 = (int)(Math.random()*6) + 1;
            w2 = (int)(Math.random()*6) + 1;
        }
        
         public int augen() {
            return w1;
        }
         
     
        
    Falls sonstige Verbesserungsvorschläge gemacht werden,bin ich natürlich auch für diese dankbar!
...zur Frage

Wie kann ich?: Eine Methode in JAVA nur einmal ausführen; Deren Wert fest speichern

Hallo,

ich bin Java-Anfänger und versuche gerade, zwei Funktionen (bspw Summe und Produkt mehrerer Werte) in einem Programm zu verpacken. Die main-Methode greift zuerst auf eine public static int[] Array zu, welche einen Auffordert, Zahlen einzugeben. anschließend muss man sich entscheiden, ob man die Summe oder das Produkt wissen möchte. Das läuft über public static int Summe bzw public static int Produkt. Nun fordert bich das Programm bei der Programmzeile, die Array[1] + Array[2] + ... realisiert (analog bei der Multiplikation) wieder zur Eingabe der Array-Werte auf, da ich diese mit int[] Array2 = Array(); abfrage.

Kann mit jemand helfen, wie ich die Werte aus Array so speichern kann, dass ich sie direkt abrufen kann (ohne erneute eingbe)??

Bin dankbar für Hilfe Nep

...zur Frage

Algorithmus mit Schleife für Array von int-Werten?

Hey,

ich bin Anfänger in Sachen Java und hatte heute eine Aufgabe die mich etwas überfordert hat.

Es ging ungefähr darum, dass ich eine Methode compute schreiben sollte, die wenn ein Array vom Typ int größer als 4 ist, die ungeraden Indizes addiert und im ersten Index des Arrays speichert. Falls aber mein Array kleiner gleich 4 ist soll es mir nur den Array anzeigen.

Ich habe einen Ansatz der mir leider falsche Werte ausgibt und würde gerne wissen wo meine Fehler liegen und was ich verbessern oder noch weiter üben kann.

public class Übung
{
    public static int[] compute( int[] arr)
    {
        int sum = 0;
        
        for( int i = 0; i< arr.length ; i++)
        {
            if(arr[i]>4)
            {
                if(arr[i] % 2 != 0)
                {
                   sum = arr[i] + sum;
                   arr[0] = sum;
                }
            }
            
            if (arr.length<=4)
            {
                return arr;
            }
        }
        return arr;
    }
}

...zur Frage

Java und Eclipse: Zufallszahl herausfinden

Ich bin gerade so am grübeln, wollte mal bissl mit Eclipse herumspielen :D

Zu meiner Frage: Es soll eine Zufallszahl zwischen 1 und 100 geraten werden. Nach jedem Versuch wird angegeben, ob die eingegebene Zahl zu groß oder zu klein oder genau richtig ist. Ich würde es auch noch gerne so haben, dass die Anzahl der Versuche dann auch noch dabei steht. Ich habe jetzt schonmal so angefangen:

import java.util.Random.*;

import ch.aplu.util.*; public class raten {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    Random zuf = new Random();
    int n = zuf.nextInt(100);

Wollte danach ne while-Schleife einfügen, aber ich bin so ein Anfänger im programmieren und komm nach mehrmaligen versuchen nicht drauf :'(

Wär schon wenn mir einer das mal erklären könnte oder mir das fertig programmierte geben könnte(dann versuche ich das daran zu verstehen :D) Schon mal herzlichen Dank!

...zur Frage

Java Array einlesen.

Hallo ich fange neu mit Java an und habe folgendes Problem:

Ich möchte einen Array von 15 er Länge einlesen und hab volgendes bereits geschrieben :


import java.util.Scanner;

public class Aufgabe2 {

public static Scanner in;

public static void main (String[] args) { int a[] = new int[15];

/* Einlesen eines 15'er Array's */

for (int i = 0; i < 15; i++){ a[i] = in.nextInt(); }

/* Ausgabe */

for (int i = 0; i < 15; i++){ System.out.printf("%d", a[i]); }

} }


Nun bekomme ich aber immer folgeden Fehlermeldung:

Exception in thread "main" java.lang.NullPointerException

woran liegt das was hab ich falsch gemacht?

Danke schonmal für eure Hilfe.

GLG Ede

...zur Frage

Was möchtest Du wissen?