Code für ein Zufallsgenerator?

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Um welche Programmiersprache geht es denn?

In Java kannst Du beispielsweise folgendermaßen eine ganzzahlige Zufallszahl zwischen min und max erzeugen:

Random rand = new Random();
int n = rand.nextInt(max - min + 1) + min;

Dies ist eine schnelle Methode zur Erzeugung von Zufallszahlen. So ganz zufällig sind sie jedoch nicht. Daher gibt es für besondere Fälle (beispielsweise Kryptographie), in denen die Zufallszahlen noch zufälliger sein müssen, folgende Methode:

Random rand = new SecureRandom()
int n = random.nextInt(max - min + 1) + min;
Kongruenzgeneratoren

Obige Zufallsgeneratoren sind ziemlich gut. Wenn du jedoch verstehen möchtest, wie sie generell funktionieren, kannst du dir mal die Kongruenzgeneratoren anschauen. Es gibt verschiedene Arten. Ein linearer Kongruenzgenerator, damit können Pseudozufallszahlen erzeugt werden, sieht beispielsweise so aus:



a ist ein Faktor, mit dem der vorherige Zufallswert multipliziert wird. Das Ergebnis wird um c, das Inkrement, erhöht. Außerdem sorgt m dafür, dass sich der Zufallswert innerhalb eines bestimmten Bereiches befindet, sodass sich Zahlen auch wiederholen können. Der Zufallswert ist immer größer null und kleiner m. Der Zufallsgenerator beginnt immer mit einem bestimmten Startwert, welcher beispielsweise aus der aktuellen Zeit bestimmt werden kann.

Eine ganz einfache Java-Implementierung könnte beispielsweise so aussehen:

class SimpleRandom {
  private int max, rand;

  public SimpleRandom(int max) {
    this.max = max;
    rand = (int)(System.currentTimeMillis() % max);
  }

  public int nextInt() {
    rand = (35537 * rand + 7) % 35543;
    return rand % max;
  }
}

Nun können beispielsweise 20 Zufallszahlen im Bereich von 1-100 (ebenfalls nach der Formel ganz oben in meiner Antwort) erzeugt werden:

SimpleRandom rand = new SimpleRandom(100 - 1 + 1);

for (int i = 0; i < 20; ++i) {
  int n = rand.nextInt() + 1;
  System.out.println(n);
}

Die erzeugten Zufallszahlen sind nicht so schlecht, aber für die Praxis eher unbrauchbar. Hier ein Live-Beispiel: https://repl.it/repls/WorthwhileRoughApplication

Wenn Du es selber entwickeln willst: Lass es bleiben, es gibt keinen Zufall (zumindest in der Softwareentwicklung nicht, die reale Welt ist ein anderes Thema), dahinter steckt also ein hoher mathematischer Aufwand, diesen Zufall vorzutäuschen.

Viele größere Frameworks hinter den Programmiersprachen dürften aber Funktionen haben, die genau sowas liefern können. Bei C# und Java heißt die Klasse "Random". Beachte bei aber C# (bei Java vermutlich auch, sicher bin ich mir aber nicht), dass diese Klasse nur gut funktioniert, wenn Du nur eine einzige Instanz nutzt und sie nicht ständig neu erstellst.

Woher ich das weiß:Berufserfahrung

tom1stein  25.01.2019, 08:25

Ich bin nicht sicher, ob ein Lehrer die Antwort "das können die meisten nicht vernünftig implementieren, also habe ich es sein gelassen" als "Aufgabe gelöst" akzeptieren wird.

0
Palladin007  25.01.2019, 16:36
@tom1stein

Reden wir hier denn von einem Lehrer oder von einem "realen" Projekt? Wenn meiner Erfahrung nach sind die meisten Aufgaben, die ein "Programmier-Lehrer" in z.B. der Berufsschule auf gibt, großer Unfug :D

Ich weiß, einem Schüler hilft es nicht, zu behaupten, die Aufgaben sind Unfug, aber ihm könnte der zweite Absatz helfen, wo konkrete Wege beschrieben werden, wie man doch zu Zufallszahlen kommt.

Mir ging es mit meiner Antwort auch eher darum, klar zu machen, dass man bei einem komplexen Thema wie Zufallszahlen lieber die bereits vorhandenen Klassen nutzen sollte, alles Andere wäre extrem unklug.

0
tom1stein  27.01.2019, 11:04
@Palladin007

Du hast recht, diese Lösung wäre unklug. Aber laut Fragestellung ist sie gefordert. Und irgendwie müssen ja auch die Leute ausgebildet werden, die in Zukunft solche Libraries für Zufallszahlen erstellen oder warten.

0
Palladin007  27.01.2019, 14:45
@tom1stein

Stimmt schon, aber die bildest Du nicht mit der Aufgabe "generiere Mal Zufallszahlen" aus und hier zu fragen, hilft da auch nicht.

Ich gehe daher stark davon aus, dass hier einfach "nur" das Programmieren gelehrt werden soll und Zufallszahlen erzeugen und anzeigen ist eine sehr einfache Aufgabe (wenn man vorhandene Klassen nutzt), die dabei hilft, ein Gefühl für die Sprache zu entwickeln.

In diesem Kontext wäre es Kontraproduktiv, zu erklären, wie man Zufallszahlen im Detail erzeugt, anstatt einfach zu zeigen, welche Klasse das schon kann.

0

Beispielhaft für einen Zahlenbereich zwischen 1 und 100, mit ganzen Zahlen:

Excel:

=ZUFALLSBEREICH(1;100)

VBA (Direktbereich):

?Int(Rnd * 100 + 1)

VBA (als Prozedur):

Public Sub Zufallszahl()
Debug.Print Int(Rnd * 100 + 1)
End Sub

Scratch:

Bild zum Beitrag

Java (quick and dirty):

System.out.println(Math.random()*100+1);

Java (ausführlich):

Random random = new Random();
System.out.println(random.nextInt(100)+1);
 - (PC, Mathematik, Software)

class Zufalssgenerator {

    public static void main(String[] args) {

        System.out.println(Math.random())

    }

}

Würde ich so ganz spontan meinen.


tom1stein  25.01.2019, 08:28

Das ist ein Zufallszahlenausgeber und kein kein -generator.

0