# 100 Zufallszahlen generieren...



## alexx910 (20. Jan 2011)

Hey,
ich bin neu hier, habe zwar seit einem "halben" Jahr Informatik an meiner Schule, allerdings muss man die Zeit halbieren und berücksichtigen, dass ich nur 2 Stunden die 2 Wochen habe  
Ja, kommen wir mal zu meinem Problem.
Und zwar hab ich so eine schöne Hausaufgabe bekommen, bei der ich 100 Zufallszahlen generieren muss, ist klar, mit Math.random() und dabei soll die Kleinste und Größte Zahl bestimmt werden.
Außerdem soll ich noch 2 Variablen verwenden, einmal min, dann noch max.
Sieht so aus, das mit noch par weiteren Variablen, i soll wohl die Vorgänge zählen und zz ist Zufallszahl.


```
double min, max, zz;
  int i;
  i=1;
  min=1.0;
  max=0.0;
```
Die ganze Angelegenheit muss ich auch noch mit while-Schleifen regeln, allerdings muss ich auch noch if und vllt else nutzen, weiß es nicht genau. Das tolle ist, dass wir while erst heute angefangen haben und nächste Woche schon eine Arbeit darüber schreiben werden. 
Von daher die Frage, ob jemand eine Idee hätte, bzw. einen Ansatz, wie man das lösen könnte, ich hab da zwar n bissl zusammengewürfelt im Unterricht, aber Garantie auf Korrektheit kann ich nicht geben 

```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 20.01.2011
  * @author
  */

public class random {

  // Anfang Attribute
  // Ende Attribute



  // Anfang Methoden
  public static void main(String[] args) {
  double min, max, zz;
  int i;
  i=1;
  min=1.0;
  max=0.0;
    while (i<=100)
        {
    zz=Math.random();
    if (zz<=max);
    {

    }
    i++;
    }

  } {}

  // Ende Methoden
}
```
Zumindest ist das alles, was wir heute im Unterricht geschafft haben :/
Hoffentlich kann mir jemand helfen.
mfg
alexx910


----------



## WIaimy (20. Jan 2011)

Fang mal damit, wo du die Zahlen abspeichern möchtest. Schließlich willst du die ja vergleichen, d.h. du hast zwei Möglichkeiten:
1) 100 Zufallszahlen erzeugen, in ein Array speichern und dann per Sortieralgorithmus vergleichen 
2) Drei Hilfsvariablen: 
- int immo = Die erzeugte Zufallszahl
- int niedrig = Die (im Moment) kleinste Zahl
- int hoch = Die (im Moment) größte Zahl
bei jedem Durchlauf deiner Schleife lässt du dann "immo" mit den anderen Variablen vergleichen und speicherst den Wert dann ggf in die Variablen


----------



## alexx910 (20. Jan 2011)

WIaimy hat gesagt.:


> Fang mal damit, wo du die Zahlen abspeichern möchtest. Schließlich willst du die ja vergleichen, d.h. du hast zwei Möglichkeiten:
> 1) 100 Zufallszahlen erzeugen, in ein Array speichern und dann per Sortieralgorithmus vergleichen
> 2) Drei Hilfsvariablen:
> - int immo = Die erzeugte Zufallszahl
> ...


Ich muss sagen, das sind wirklich gute Ideen, allerdings sind wir nicht einmal so weit, dass wir sortieralgorithmen oder arrays nutzen  Ich könnte das ganze bestimmt iwie zusammenklatschen, wenn ich weiterhin in google rumstöber, aber ich glaube, dass ich mir das net so schnell merken könnte...
trotzdem danke


----------



## XHelp (20. Jan 2011)

Sortieralgorithmen brauchst du hier nicht.
Rück den Code vernünftig ein, dann wirst du sehen, dass du bei der if-Abfrage ein Semikolon zu viel hast. Oder dass zum Schluss irgendwelche Klammer stehen.
Aber zum Problem: du vergleichst auf zz<max. Was soll es dir brigen? Du solltest viel mehr darauf testen, ob die generierte Zahl nicht größer ist, als das jetzige Maximum.


----------



## alexx910 (20. Jan 2011)

XHelp hat gesagt.:


> Sortieralgorithmen brauchst du hier nicht.
> Rück den Code vernünftig ein, dann wirst du sehen, dass du bei der if-Abfrage ein Semikolon zu viel hast. Oder dass zum Schluss irgendwelche Klammer stehen.
> Aber zum Problem: du vergleichst auf zz<max. Was soll es dir brigen? Du solltest viel mehr darauf testen, ob die generierte Zahl nicht größer ist, als das jetzige Maximum.



Ich frag mich auch, wieso ich das vergleichen muss^^. Aber wie kann ich dann die jeweilige Zahl mit dem Ausgabewert vergleichen? wie kann ich das anstellen?


----------



## XHelp (20. Jan 2011)

Wie warum? Weil du prüfen willst, ob die größer als das Maximum ist.
Und wie hast du doch schon stehen: 
	
	
	
	





```
if (a>b) {...
```


----------



## alexx910 (20. Jan 2011)

XHelp hat gesagt.:


> Wie warum? Weil du prüfen willst, ob die größer als das Maximum ist.
> Und wie hast du doch schon stehen:
> 
> 
> ...



Das mit Warum war ironisch gemeint^^ Und die 2. Frage war darauf gerichtet, dass ich nicht wirklich weiß, wie ich einen bestimmten Ausgabewert mit dem vorherigen vergleichen. Es sind ja x-beliebige Werte, die ich selber nicht angebe, sondern der Random ausspuckt, von daher weiß ich nicht, wie ich an diese rankomme, um sie dann zu vergleichen.


----------



## XHelp (20. Jan 2011)

Den Wert hast du doch in 
	
	
	
	





```
zz
```
. Welcher Wert vor 30 Runden war, ist eigentlich mit dieser Aufgabenstellung egal


----------



## alexx910 (20. Jan 2011)

Sry, aber iwie werde ich nicht schlau draus  Ich schreib lieber die Vollständige Aufgabenstellung hier rein, falls ich etwas missverständlich umschrieben habe:


> Erstellen Sie ein Programm, das 100 Zufallszahlen erzeugt und dabei die Kleinste und Größte bestimmt.
> Hinweis: Verwenden Sie zwei Variablen _min _und _max_, die während der Schleife laufend den bisher kleinsten bzw. größten Wert enthalten.


also, ich muss ja dann am ende das ganze nach größe sortiert rausbekommen, wie mache ich das am besten? Vergleich, gerne, aber was womit vergleichen? zz mit irgendwas, aber womit weiß ich auch nicht 
Zudem muss ich ja das "jetztige" maximum vergleichen mit der random zahl, wie stelle ich das an?


----------



## XHelp (20. Jan 2011)

Wo steht da was von sortiert? Wenn du auf die Werte doch aus irgendeinem Grund zugreifen willst: fang klein an und lass dir erstmal ein 100-elementiges-Array mit Zufallszahlen füllen


----------



## alexx910 (20. Jan 2011)

Ich dachte, dass der Teil des Hinweises eine Sortierung hindeutet :/ Oops. Output von 100 xbeliebigen Zahlen ist kein Problem. Einfach das obere nehmen, egal ob mit oder ohne semicolon und schon haut der ein Dos-fenster mit 100 zahlen raus.
Wie kann ich weitermachen? Und wie bereits gesagt, mit array bin ich noch nicht vertraut :/ Von daher hätte ich daran gedacht, dass ich den Output einfach über System.out.print(zz) mache, da gibt der mir auch 100 Zahlen raus. 
Was könnte ich machen, um das größte und kleinste Glied der Liste festzustellen?


----------



## XHelp (20. Jan 2011)

max ist das aktuelle Maximum, zz ist die generierte Zahl. Wenn zz>max, dann wird max der Wert von zz zugewiegen, d.h. zz wird zum neuen max.
Ähnliche geschichte bei dem Minimum.


----------



## alexx910 (20. Jan 2011)

XHelp hat gesagt.:


> max ist das aktuelle Maximum, zz ist die generierte Zahl. Wenn zz>max, dann wird max der Wert von zz zugewiegen, d.h. zz wird zum neuen max.
> Ähnliche geschichte bei dem Minimum.



sollte ich dann mit nem else weitermachen? 
Ich hab dann ja stehen, dass zz>max als If,
dann müsste ich ja eigentlich ein else(zz<min) machen, oder? :/


----------



## XHelp (20. Jan 2011)

else(zz<min) ist syntaktisch falsch. Außerdem hat die Suche nach max nichts mit der suche nach min zu tun. Ich würde es also in separaten Abfragen machen.


----------



## alexx910 (20. Jan 2011)

XHelp hat gesagt.:


> else(zz<min) ist syntaktisch falsch. Außerdem hat die Suche nach max nichts mit der suche nach min zu tun. Ich würde es also in separaten Abfragen machen.



Also empfielst du mir eher, das ganze in 2 While-schleifen zu packen? :/ Oder irre ich mich jetzt^^ Diese Coder-Sprache ist für mich im moment ein Rätsel^^ Ich probiers dann mal aus


----------



## XHelp (20. Jan 2011)

Nein, nicht 2 Schleifen, 2 ABFRAGEN:

```
for (......) {
...
  if (zz>max) {
    //mach was
  }
  if (zz<min) {
    //mach was anderes
  }
...
}
```


----------



## alexx910 (20. Jan 2011)

Hmm... Ich begreifs nicht, alles so wie gesagt befolgt, und der Java-Editor haut mir nen Fehler raus:


> random.java:25:7: variable zz might not have been initialized
> if (zz>max)
> ^
> 1 error


Was deutet der Editor damit an?
Und sry für die ganzen Fragen, aber ich hab wirklich nicht viel Ahnung von dem Zeug.


----------



## XHelp (20. Jan 2011)

Was hast du denn jetzt alles stehen?
Ich rate dir aber mal etwas an Anfängerliteratur über Grundlagen durchzulesen


----------



## alexx910 (20. Jan 2011)

XHelp hat gesagt.:


> Was hast du denn jetzt alles stehen?
> Ich rate dir aber mal etwas an Anfängerliteratur über Grundlagen durchzulesen


also, das ist alles was ich da stehen habe:

```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 20.01.2011
  * @author
  */

public class random {

  // Anfang Attribute
  // Ende Attribute



  // Anfang Methoden
  public static void main(String[] args) {
  double min, max, zz;
  int i;
  i=1;
  min=1.0;
  max=0.0;
    for (i = 1;i<=100;i++) {

  if (zz>max)
  {
  System.out.print(zz);  //mach was
  }
  if (zz<min)
  {
  System.out.print(zz);  //mach was anderes
  }
  }}


  // Ende Methoden
}
```
Und was für Literatur würdest du mir so empfehlen, was man eventuell in einem Buchfachhandel erwerben könnte? bzw. als E-Book?


----------



## XHelp (20. Jan 2011)

Fehlt da bei einem Programm, welches 100 Zufallszahlen auswertet nicht sowas triviales wie *trommelwirbel* die Generierung von Zufallszahlen?  Im ersten Post hattest du es ja noch.

Was die Bücher angeht: es existieren bereits mehrere Threads darüber. Kann nur soviel sagen, dass ich dir "Java Intensivkurs" von Block *nicht* empfehle.


----------



## alexx910 (20. Jan 2011)

XHelp hat gesagt.:


> Fehlt da bei einem Programm, welches 100 Zufallszahlen auswertet nicht sowas triviales wie *trommelwirbel* die Generierung von Zufallszahlen?  Im ersten Post hattest du es ja noch.
> 
> Was die Bücher angeht: es existieren bereits mehrere Threads darüber. Kann nur soviel sagen, dass ich dir "Java Intensivkurs" von Block *nicht* empfehle.



Stimmt  Da hast du allerdings recht^^
Ich hab die Deklaration einfach verschwinden lassen  Mein Fehler^^
Hmm..Ich mach mich morgen dann schlau und danke für dich Hilfe  
Gut, das Programm funktioniert jetzt schon, aber spuckt halt alle Ziffern doppelt aus  Und leider nicht geordnet^^ Aber ich mach mich vllt über den Ordnungsalgorithmus schlau, habe das Wochenende mal zeit^^


----------



## XHelp (20. Jan 2011)

Das sind Zufallszahlen, die sollen von der Definition her nicht geordnet rauskommen.
Die doppelte Ausgabe erfolgt deshalb, weil du nichts sinnvolle in den Abfragen machst:

```
for... {
  zz = Math.random();
  System.out.println("Neue Zahl: "+zz);
  if (zz>max) {
    System.out.println("Neues Maximum gefunden! Vorher war es: "+max);
    max = zz;
  }
  if (zz<min) {
    System.out.println("Neues Minimum gefunden! Vorher war es: "+min);
    min = zz;
  }
}
```
So sollte es eher sein. Die Ausgaben IN den Abfragen sind nur dazu da, damit du nachvollziehen kannst, was da passiert


----------



## Andi_CH (21. Jan 2011)

alexx910 hat gesagt.:


> random.java:25:7: variable zz might not have been initialized
> if (zz>max)
> ^
> 1 error
> ...



Aber lesen kannst du? Ein wenig Englisch auch? Ach dann übersetz ich es mal für dich;:

Die Variable zz wurde nicht initialisiert.

Was das heissen soll?

Der Variable zz wurde kein Wert zugewiesen -> lies mal:

```
package com.javaforum.test;

public class random {
	// Anfang Methoden
	public static void main(String[] args) {
		double min, max, zz;
		int i;
		i=1;  // das nützt rein gar nichts, da i gleich am Anfang der Schleife gesetzt wird 
		min=1.0;
		max=0.0;
		// tja da sollte vielleicht zz auch ein Wert zugewiesen werden!
		// Aus diesem Grund hasse ich es mehr als eine Variable auf einer Zeile zu 
		// deklarieren - man übersieht so schnell eine 
		for (i = 1;i<=100;i++) {
			if (zz>max)
			{
				System.out.print(zz);  //mach was
			}
			if (zz<min)
			{
				System.out.print(zz);  //mach was anderes
			}
		}
		// Ende Methoden
	}
}
```


und jetzt schaust du mal das an - so würde ich das schreiben
Klassennamen Gross
Variabeln einzeln deklariert und gleich initialisiert
Schleifenindex in der Schleife drin deklariert


```
public class Random {

	public static void main(String[] args) {
		double min = 1.0;
		double max = 0.0;
		double zz = 0.0;
		for (int i=1; i<=100; i++) {
			if (zz > max)	{
				System.out.print(zz);  //mach was
			}
			if (zz < min)	{
				System.out.print(zz);  //mach was anderes
			}
		}
	}
}
```


----------



## alexx910 (21. Jan 2011)

Andi_CH hat gesagt.:


> Aber lesen kannst du? Ein wenig Englisch auch? Ach dann übersetz ich es mal für dich;:
> 
> Die Variable zz wurde nicht initialisiert.
> 
> ...


Danke für die Erklärung. Aber naja, wir haben das so in der Schule halbwegs angeschnitten und ja, da weiß ich auch nimmer. Und zur Aufgabe, ja ich habe die Deklaration von zz vergessen^^ Gestern noch gefixxt und es lief doch, aber halt so, wie ich es beschrieben habe. Ich hoffe, dass ist wenigstens der sinn der aufgabe, denn eine Lösung bekommen wir erst später :/
Großes Dankeschön deswegen  Sowohl an die Andi, als auch an dich XHelp


----------



## alexx910 (23. Jan 2011)

Hey, liebe coder-freunde, habe die Lösung von meinem Lehrer bekommen. Nun könnt auch ihr sehen, wie er es haben wollte 

```
/** 2. Aufgabenblatt Kontrollstrukturen
  *  Aufgabe 6 : Zufallszahlen
  *
  *  Es sollen 100 Zufallszahlen erzeugt werden, und dabei die Kleinste
  *  und Groesste bestimmt werden.
  *
  *  Diese sollen in die Variablen min und max gespeichert werden.
  */

public class Zufallszahlen {

  public static void main(String[] args) {

  //Variablendeklaration:
  //In zufallszahl wird die aktuelle Zufallszahl gespeichert,
  //in min, max das aktuelle Minimum und Maximum.
  double zufallszahl, min, max;
  int i;
  
  //Variableninitialisierung: Startwertevorgabe fuer min und max:
  // Da Math.random() Zufallszahlen zwischen 0 und 1 erzeugt, ist es
  // sinnvoll als Startwert fuer das Minimum 1.0 zu waehlen, damit sich der
  // immer weiter verkleinern kann. Fuer das Maximum wird dem entsprechend 0.0 gewahlt.
  min = 1.0;
  max = 0.0;
  i=1; //Startwert fuer die Schleifenvariable

  while(i<=100)
    {

    //Es wird eine neue Zufallszahlbestimmt und in zufallszahl gespeichert.
    zufallszahl = Math.random();

    //Abfragen, ob die zufallszahl kleiner ist als das aktuelle Minimum.
    //Falls ja, setzte den Wert der zufallszahl als neues Minimum.
    if (zufallszahl < min)
      {
      min = zufallszahl;
      }
      
    //Abfragen, ob die zufallszahl groesser ist als das aktuelle Maximum.
    //Falls ja, setzte den Wert der zufallszahl als neues Maximum.
    if (zufallszahl > max)
      {
      max = zufallszahl;
      }
      
    //Zusaetzliche Ausgabe der Werte fuer min und max nach jeweils 10 Iterationen
    if ((i%10)==0)
      {
        System.out.println("Nach " + i + " Durchlaeufen gilt:");
        System.out.println("Ermitteltes Minimum:" + min + "\n" + "Ermitteltes Maximum:" + max + "\n" );
      }

      //WICHTIG: Erhoehung der Schleifenvariable i um +1
      //Wird dieser Schritt vergessen, wird eine Endloschleife erzeugt!!!!
      i++;
    }

    // Gebe ermitteltes Min und Max aus:
    System.out.println("Endergebnis:");
    System.out.println("Ermitteltes Minimum:" + min + "\n" + "Ermitteltes Maximum:" + max + "\n" );
  }
}
(c) by Bloem
```


----------



## kodela (26. Jan 2011)

Eine Kleinigkeit wurde bisher noch nicht angesprochen. Die beiden Variablen min und max, bevor man sie mit den jeweils erzeugten Zufallszahlen vergleicht, müssen erst einmal initialisiert werden. Das macht man am besten, indem man beiden die erste erzeugte Zufallszahl zuweist.

Danach kann man, wie von XHelp bereits aufgezeigt, jede der 99 nächsten Zufallszahlen mit min und max vergleichen und falls die Zufallszahl kleiner als min ist min aktualisieren und gleichermaßen mit max verfahren.

Davon, dass alle Zufallszahlen in irgend einer Form auszugeben sind, ist in der Aufgabe nicht die Rede.

kodela


----------



## XHelp (26. Jan 2011)

kodela hat gesagt.:


> Eine Kleinigkeit wurde bisher noch nicht angesprochen. Die beiden Variablen min und max, bevor man sie mit den jeweils erzeugten Zufallszahlen vergleicht, müssen erst einmal initialisiert werden.



Die wurden doch initialisiert. Darüber hinaus ist es einfacher min mit dem jeweils möglichen Maximum und max mit dem jeweils möglichen Minimum zu initialisieren, wie es auch die diesem Code der Fall ist


----------



## kodela (26. Jan 2011)

XHelp hat gesagt.:


> Die wurden doch initialisiert.



Das ist richtig. Habe meinen Beitrag offline geschrieben und als er eingestellt war, habe ich gesehen, dass zwischenzeitlich die Initialisierung erfolgt ist.


----------



## XHelp (26. Jan 2011)

Die Initialisierung wurde doch schon im 1. Post gemacht


----------

