Es gibt Methoden wie die Suche nach Duplikaten, aber ich frage mich, ob es eine bessere Lösung für diese Aufgabe gibt.Was ist der effizienteste Weg, eindeutige Doppelwerte in Java zu generieren?
Antwort
Sie können streams
dafür verwenden.
double[] array = new Random().doubles()
.distinct()
.limit(500) // How many you want.
.toArray();
Eine weitere nette Anwendung von JDK 8. Ich versuche mehr und mehr damit zu üben. – duffymo
Sie können Set
Sammlung verwenden. Es werden keine eindeutigen Werte eingefügt. Unten ist ein Beispiel:
Set<Double> doubles = new HashSet<Double>();
Random r = new Random();
for(int i=0 ; i<100 ; i++){
doubles.add(r.nextDouble() * 100);
}
Beachten Sie, dass Sie Ihre Doubles immer noch in Doubles umwandeln müssen;) – Matthias
Java wird sich darum kümmern. –
Sie sollten 'doubles.size() <100 'verwenden, sonst werden Sie mit weniger als 100 enden. (Oder was auch immer die Anzahl der eindeutigen Zahlen ist, die Sie wollen). –
Zuerst müssen Sie verstehen, wie ein Zufallsgenerator funktioniert. Eine Folge von positiven ganzen Zahlen, langen ganzen Zahlen, ohne dass es doppelt ist, wird berechnet. Diese Sequenz ist mindestens 2^31 Elemente lang. Die echten Doubles im Bereich von 0.0 ..... 1.0 sind das Ergebnis einer Gleitkommadivision. Die Flotationspunkteteilung ist nie exakt. Wenn Sie diese reellen Zahlen verwenden, um Ganzzahlen in kleineren Intervallen zu generieren, ist es die schnellste Methode, einen Zufallszahlengenerator zu verwenden, der Ihnen eine positive Ganzzahl aus diesem Intervall gibt. Der Algorithmus für den Lehmer-Generator ist x1 = (x0 * m)% div x0: die letzte Zufallszahl, x1 die nächste Zufallszahl. Div und m sind Primzahlen. m < div. Die erste x0 wird durch die vom Benutzer aufgerufene Seed-Nummer ausgewählt. Es ist klar, dass die x_i kleiner als div sind. Für die anderen Eigenschaften eines guten Zufallsgenerators gibt es keinen Kurzbeweis.
Mein Vorschlag: Schreiben Sie eine Methode für einen Lehmer-Generator mit m = 279470273 und div = 4294967291. Ich fand diese Zahlen auf mehreren Webseiten. Div = 2^32-5, so können Sie sicher sein, eine Sequenz von fast 2^32 positive Long Integer, alle unterschiedlich zu bekommen. Konvertiere sie in Doppel und teile sie mit div als Doppel. Sie erhalten im offenen Intervall (0,0, ... 1,0) doppelte Werte und alle diese Doppelungen sind unterschiedlich. Die zufälligen ganzen Zahlen sind klein genug, dass die Quotienten auch unterschiedlich sind. Wenn Sie einen Zufallsgenerator verwenden, der größere ganzzahlige Zufallszahlen erzeugt, können Sie nicht sicher sein, dass auch Doppelungen verschieden sind, der Grund sind Rundungsfehler.
Der Name von D. H. Lehmer wurde falsch geschrieben (Lehmert). –
Der Name von D. H. Lehmer wurde falsch geschrieben (Lehmert). m = 279470273 und div = 4294967291 sind Vorschläge von Park und Miller. div = 2^32-5 eine Primzahl. m auch eine Primzahl. ---- Ursprünglich verwendeten Park und Miller div = 2.147.483.647 = 2^31-1 a Mersenne Prime und m = 16,807 = 7^5. Siehe http://www.firstpr.com.au/dsp/rand31/p1192-park.pdf –
Sie können nicht vermeiden, nach Duplikaten zu suchen. Sie können es jedoch an eine Bibliotheksroutine delegieren. –
@ ThorbjørnRavnAndersen Wenn Sie wissen, dass die Periode eines Linear Congruential Generators größer als die erforderliche Anzahl von Samples ist, müssen Sie nicht nach Duplikaten suchen. – Matthias
Offensichtlich wusste OP das nicht. –