Frage von halbleeresgals, 119

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

Ich soll ein Programm schreiben, dass 6000000x Zahlen zwischen 1 und 6 zufällig würfelt und in einem Array speichert ... Da ich totaler Anfänger bin und mir das Internet auch nicht weiter helfen konnte versuch ich es nun hier mehr als (siehe folgenden Anfang) habe ich nicht =/ : public class Wuerfel {

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

    int zahl=(int)((Math.random()*6)+1);

    for (int i=0; i<=6000000; i++)
    {
    }

}

}

Antwort
von wotan38, 15

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.

Antwort
von kordely, 106

6 Millionen? Das wird schwierig in einem Array. Benutze Bytes, oder besser: Zähle die Statistiken während der Schleife!

Kommentar von kordely ,

Für ein int braucht Java 32 bits, für ein Byte nur 8.

Kommentar von sarahj ,

wieso?
6mio * 4bytes macht 24Mb.
Als ich noch jung war, war das ein Problem. Heute nicht mehr ;-D

Antwort
von PeterWolf42, 104
public static void main(String[] args){
       int array[] = new int[6000000]; //Erzeugt ein        //Array vom Typ int mit 6000000 Plätzen              for (int i=0; i<6000000; i++){
           array[i] = (int)((Math.random()*6)+1); 
           //Setzt an die Stelle i im Array eine                //  zufällige Zahl zwischen 1 und 6             }
}
Kommentar von halbleeresgals ,

weißt du auch zufällig wie ich jetzt die Häufigkeiten raus bekomme für 1 bis 6 ? 

Kommentar von PeterWolf42 ,

Klar. Einfach für jeden Wert eine Zählvariable anlegen und über das Array mit der for-Schleife iterieren mit einer switch-case-Anweisung prüfen, welche Zahl im Array gespeichert ist und die entsprechende Zählvariable um 1 erhöhen.

Kommentar von halbleeresgals ,
wenn ich das so eingebe 
for (int i=0; i<=6000000; i++){                        array1[i]=(int)((Math.random()*6)+1);

dann kommt in der console "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6000000at Wuerfel.main(Wuerfel.java:19)"

Kommentar von PeterWolf42 ,

Ja, weil die Speicherstellen im Array vom der Position 0 gezählt werden, d.h. ein Array der Länge 3 hat die Positionen 0,1,2. Deswegen zählt in meinem Code i ja auch nur solange hoch, solange es < (kleiner) als 6000000 ist.

Kommentar von halbleeresgals ,

Also irgendwie seh ich jetzt hier nicht mehr durch wenn ich das ausführe

for (int i=0; i< 6000000; i++){           
 array1[i]=(int)((Math.random()*6)+1);            System.out.println(array1);

kommt folgendes 6000000 raus "[I@6d06d69c" ich denke da kommen random zahlen zwischen 1 und 6 hin

Kommentar von PeterWolf42 ,

Weil du mit 

System.out.println(array1);

versuchst, das Ganze Array an sich auszugeben. Um einen einzelnen Wert auszugeben, musst du z.B. 

System.out.println(array1[0]);

nutzen. 

Kommentar von halbleeresgals ,

Oh stimmt den Fehler mach ich immer ;D

Und jetzt noch eine Frage zu den Switch anweisung mit der Zählervariablen wie meinst du das ? 

Kommentar von PeterWolf42 ,

Naja. Um die Häufigkeit zu ermitteln, musst du ja für jeden Wert array1[i] Prüfen, ob es eine 1, oder eine 2 usw. ist. Du könntest also 6 if-Anweisungen machen. Mit einer switch - case Anweisung lässt sich das jedoch mit einem Befehlt Testen.

Sei z.B. int zahl = 0;
switch( zahl){
  case 0: // tu was, wenn Zahl == 0; break;
  case 1: // tu was, wenn Zahl == 1; break;
}

So kann man für verschiedene Werte einer Variable verschiedene Aktionen machen. In deinem Fall würde man eine die entsprechende Zählvariable um eins erhöhen. Wichtig ist das break ; nicht zu vergessen, da sonst alle nachfolgenden Befehle in den switch-Block auch ausgeführt werden.

Kommentar von halbleeresgals ,

ok egal was ich versuche ich habe wirklich null ahnung wie ich das umsetzen soll

Kommentar von sarahj ,

besser ohne switch; danach hat man in hi[n] die Anhahl per n:

int hi = new int[6]; // häufigkeiten

for (int i=0; i<6000000; i++) {
    int wert = array[i];

    hi[wert - 1]++;
}

for (int n=1; n<=6; n++) {
System.out.println("häufigkeit von "+n
+" ist "
+hi[n-1]);
}
Antwort
von varlog, 119

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.

Keine passende Antwort gefunden?

Fragen Sie die Community