本文实例为大家分享了 Java 随机数生成代码 , 供大家参考 , 具体内容如下
Paket com.gonvan.common.utils; import Java.util.*; /** * 随机数工具 * * @Author yuerzm * * /public lotteryaliasMethod { /** * Der Zufallszahlengenerator, der verwendet wird, um aus der Verteilung zu probieren. */ Private endgültige zufällige zufällige; /*** Die Alias -Tabellen. */ Private Final int [] alias; /*** Die Wahrscheinlichkeitstabellen. */ private endgültige Doppel [] Wahrscheinlichkeit; /** * Konstruiert ein neues Aliasmethode, um aus einer diskreten Verteilung und * die Ergebnisse auf der Grundlage der Wahrscheinlichkeitsverteilung zurückzuprobieren. * <p/> * als Eingabe eine Liste von Wahrscheinlichkeiten angegeben, die den Ergebnissen 0, 1, * ..., n - 1 entsprechen, erstellt dieser Konstruktor die Wahrscheinlichkeits- und Alias -Tabellen *, die zur effizienten Stichprobe aus dieser Verteilung erforderlich sind. * * @param Wahrscheinlichkeiten * Die Liste der Wahrscheinlichkeiten. */ public lotteryaliasMethod (Liste <Double> Wahrscheinlichkeiten) {this (Wahrscheinlichkeiten, new random ()); } /** * konstruiert einen neuen Aliasmethoden, um aus einer diskreten Verteilung und * die Ergebnisse auf der Grundlage der Wahrscheinlichkeitsverteilung zurückzuprobieren. * <p/> * als Eingabe eine Liste von Wahrscheinlichkeiten angegeben, die den Ergebnissen 0, 1, * ..., n - 1 entsprechen, zusammen mit dem Zufallszahlengenerator, der als * der zugrunde liegende Generator verwendet werden sollte, erstellt dieser Konstruktor die Wahrscheinlichkeits- und * Alias -Tabellen, die zur effizienten Stichprobe aus dieser Verteilung erforderlich sind. * * @param Wahrscheinlichkeiten * Die Liste der Wahrscheinlichkeiten. * @param random * Der zufällige Zahlengenerator * / public lotteryaliasMethod (List <Double> Wahrscheinlichkeiten, zufällig) { / * Beginnen Sie mit grundlegenden strukturellen Überprüfungen für die Eingaben. */ if (Wahrscheinlichkeiten == null || random == null) werfen neue nullpointerexception (); if (Wahrscheinlichkeiten. /* Platz für die Wahrscheinlichkeits- und Alias -Tabellen zuweisen. */ Wahrscheinlichkeit = neues Double [Wahrscheinlichkeiten.Size ()]; alias = new int [Wahrscheinlichkeiten.size ()]; /* Speichern Sie den zugrunde liegenden Generator. */ this.random = random; /* Berechnen Sie die durchschnittliche Wahrscheinlichkeit und speichern Sie sie für die spätere Verwendung. * / endgültig doppelter Durchschnitt = 1,0 / Wahrscheinlichkeiten.Size (); / * * Erstellen Sie eine Kopie der Wahrscheinlichkeitsliste, da wir Änderungen daran vornehmen werden. */ Wahrscheinlichkeiten = New ArrayList <Double> (Wahrscheinlichkeiten); /* Erstellen Sie zwei Stapel, um als Worklists zu fungieren, während wir die Tabellen bevölkern. */ Deque <Integer> small = new ArrayDeque <Ganzzahl> (); Deque <Ganzzahl> groß = new ArrayDeque <Ganzzahl> (); /* Füllen Sie die Stapel mit den Eingangswahrscheinlichkeiten. * / für (int i = 0; i <Wahrscheinlichkeiten.size (); ++ i) { / * * Wenn die Wahrscheinlichkeit unter der durchschnittlichen Wahrscheinlichkeit liegt, fügen wir es der kleinen Liste hinzu; Andernfalls fügen wir es der großen Liste hinzu. */ if (Wahrscheinlichkeiten.get (i)> = durchschnittlich) groß.Add (i); sonst small.add (i); } / * * Als Anmerkung: In der mathematischen Spezifikation des Algorithmus werden wir die kleine Liste immer vor der großen Liste erschöpfen. * Aufgrund schwimmender Ungenauigkeiten gilt dies jedoch nicht unbedingt. * Folglich muss diese innere Schleife (die versucht, kleine und große * Elemente zu kombinieren) überprüfen, ob beide Listen nicht leer sind. * / while (! small.isempty () &&! groß.isempty ()) { /* Holen Sie sich den Index der kleinen und großen Wahrscheinlichkeiten. */ int weniger = small.removelast (); int more = groß.removelast (); / * * Diese Wahrscheinlichkeiten wurden noch nicht so skaliert, dass * 1/n Gewicht 1,0 erhält. Wir machen das stattdessen hier. */ Wahrscheinlichkeit [weniger] = Wahrscheinlichkeiten.get (weniger) * Wahrscheinlichkeiten.size (); alias [weniger] = mehr; / * * Verringern Sie die Wahrscheinlichkeit des größeren um die entsprechende * Menge. */ Wahrscheinlichkeiten.set (mehr, (Wahrscheinlichkeiten.get (mehr) + Wahrscheinlichkeiten.get (weniger)) - Durchschnitt); / * * Wenn die neue Wahrscheinlichkeit geringer ist als der Durchschnitt, fügen Sie sie in die kleine Liste hinzu; Andernfalls fügen Sie es der großen Liste hinzu. * / if (Wahrscheinlichkeiten.get (mehr)> = 1.0 / Wahrscheinlichkeiten.size ()) Large.add (mehr); sonst small.add (mehr); } / * * Zu diesem Zeitpunkt befindet sich alles in einer Liste, was bedeutet, dass die verbleibenden Wahrscheinlichkeiten alle 1 /n sein sollten. Setzen Sie sie basierend darauf an * angemessen. Aufgrund numerischer Probleme können wir nicht sicher sein, welcher * Stack die Einträge enthält, also leeren wir beide. */ while (! small.isempty ()) Wahrscheinlichkeit [small.removelast ()] = 1,0; while (! groß. } /*** Stichproben aus der zugrunde liegenden Verteilung. * * @return einen zufälligen Wert, der aus der zugrunde liegenden Verteilung abgetastet wurde. * / public int next () { /* generieren Sie eine faire Würfelrolle, um zu bestimmen, welche Spalte zu inspizieren soll. */ int column = random.nextint (Wahrscheinlichkeit.length); /* Erzeugen Sie einen voreingenommenen Münzwurf, um zu bestimmen, welche Option auswählen soll. */ boolean cointoss = random.nextDouble () <Wahrscheinlichkeit [Spalte]; /* Basierend auf dem Ergebnis geben Sie entweder die Spalte oder ihren Alias zurück. */ return cointoss? Spalte: alias [Spalte]; }}以上就是本文的全部内容 , 希望对大家的学习有所帮助。 希望对大家的学习有所帮助。