Ja, aber Sie müssen sagen, dass dies generatoreine Instanz vonjava.util.Random
stivlo
25
Ich würde nicht Random()jedes Mal erstellen, wenn Sie die Funktion ausführen: Der Zufallsgenerator soll Verlauf haben. Wenn nicht, ist es extrem vorhersehbar. In diesem Fall ist das überhaupt kein Problem - aber es sollte erwähnt werden, dass dies array[(int)(System.currentTimeMillis() % array.length)]genauso gut ist wie die vorgeschlagene Lösung.
alf
4
@alf, das ist bei weitem nicht so gut wie die vorgeschlagene Lösung. new Random()versucht, eine Instanz zu erstellen, die einen anderen Startwert als alle zuvor erstellten hat Random. Ihr Ansatz würde schrecklich brechen, wenn Sie die Funktion in kurzer Zeit zweimal aufrufen.
Aioobe
1
@alf einige Systeme haben keine millisekundengenaue Uhr, was einige Optionen ausschließen kann, wenngcd(array.length,clockAccuracy)!=1
Ratschenfreak
3
Ich habe gerade eine Benachrichtigung bemerkt, dass ich diese Antwort abgelehnt habe - ich muss versehentlich darauf geklickt haben; Leider lässt mich die Benutzeroberfläche nicht rückgängig machen (es heißt, ich kann meine Stimme nur ändern, wenn die Antwort bearbeitet wird ...). Also entschuldige mich bei Chris Dennett.
Peter Hanley
13
Mit dem Zufallsgenerator können Sie einen Zufallsindex generieren und das Element an diesem Index zurückgeben:
Wenn Sie zufällige Array-Elemente auswählen , die unvorhersehbar sein müssen, sollten Sie java.security.SecureRandom anstelle von Random verwenden. Das stellt sicher, dass jemand, der die letzten paar Picks kennt, keinen Vorteil darin hat, die nächsten zu erraten.
Wenn Sie mithilfe von Generika eine Zufallszahl aus einem Object-Array auswählen möchten, können Sie hierfür eine Methode definieren (Source Avinash R im Random-Element aus dem String-Array ):
import java.util.Random;publicclassRandArray{privatestaticRandom rand =newRandom();privatestatic<T> T randomFrom(T... items){return items[rand.nextInt(items.length)];}}
Verwenden Sie java.util.Randomdiese Option, um eine Zufallszahl zwischen 0 und Array-Länge zu generieren: random_numberund verwenden Sie dann die Zufallszahl, um die Ganzzahl zu erhalten:array[random_number]
Sie mischen also eine Liste mit O(nlogn)zeitlicher Komplexität, erstellen die Kopie zweimal mit insgesamt dreimal so viel Speicher wie das ursprüngliche Array, obwohl das von OP angefragte Problem mit O(1)zeitlicher Komplexität und O(1)Speicher gelöst werden kann ...?
Jaroslaw Pawlak
Ja, Sie haben Recht. Es war besser, mit konstanter zeitlicher und räumlicher Komplexität zu tun.
Ravi Sapariya
0
package io.github.baijifeilong.tmp;import java.util.concurrent.ThreadLocalRandom;import java.util.stream.Stream;/**
* Created by [email protected] at 2019/1/3 下午7:34
*/publicclassBar{publicstaticvoid main(String[] args){Stream.generate(()->null).limit(10).forEach($ ->{System.out.println(newString[]{"hello","world"}[ThreadLocalRandom.current().nextInt(2)]);});}}
Antworten:
quelle
generator
eine Instanz vonjava.util.Random
Random()
jedes Mal erstellen, wenn Sie die Funktion ausführen: Der Zufallsgenerator soll Verlauf haben. Wenn nicht, ist es extrem vorhersehbar. In diesem Fall ist das überhaupt kein Problem - aber es sollte erwähnt werden, dass diesarray[(int)(System.currentTimeMillis() % array.length)]
genauso gut ist wie die vorgeschlagene Lösung.new Random()
versucht, eine Instanz zu erstellen, die einen anderen Startwert als alle zuvor erstellten hatRandom
. Ihr Ansatz würde schrecklich brechen, wenn Sie die Funktion in kurzer Zeit zweimal aufrufen.gcd(array.length,clockAccuracy)!=1
Mit dem Zufallsgenerator können Sie einen Zufallsindex generieren und das Element an diesem Index zurückgeben:
quelle
Wenn Sie mehrmals ein zufälliges Element erhalten, möchten Sie sicherstellen, dass Ihr Zufallszahlengenerator nur einmal initialisiert wird.
Wenn Sie zufällige Array-Elemente auswählen , die unvorhersehbar sein müssen, sollten Sie java.security.SecureRandom anstelle von Random verwenden. Das stellt sicher, dass jemand, der die letzten paar Picks kennt, keinen Vorteil darin hat, die nächsten zu erraten.
Wenn Sie mithilfe von Generika eine Zufallszahl aus einem Object-Array auswählen möchten, können Sie hierfür eine Methode definieren (Source Avinash R im Random-Element aus dem String-Array ):
quelle
Verwenden Sie
java.util.Random
diese Option, um eine Zufallszahl zwischen 0 und Array-Länge zu generieren:random_number
und verwenden Sie dann die Zufallszahl, um die Ganzzahl zu erhalten:array[random_number]
quelle
Verwenden Sie die Zufallsklasse :
quelle
Sie können auch verwenden
Math.random()
gibt eindouble
zwischen0.0
(inklusive) bis1.0
(exklusiv) zurückWenn Sie dies mit multiplizieren, erhalten
array.length
Siedouble
zwischen0.0
(inklusive) undarray.length
(exklusiv)Casting to
int
wird abrunden und gibt Ihnen eine ganze Zahl zwischen0
(inklusive) undarray.length-1
(inklusive)quelle
Da Sie Java 8 haben, besteht eine andere Lösung darin, die Stream-API zu verwenden.
Wobei
1
das niedrigste int (einschließlich) und500
das höchste (exklusiv) generiert wird.limit
bedeutet, dass Ihr Stream eine Länge von 500 hat.Zufall ist aus
java.util
Paket.quelle
Schauen Sie sich diese Frage an:
Wie generiere ich zufällige Ganzzahlen innerhalb eines bestimmten Bereichs in Java?
Sie möchten eine Zufallszahl von 0 bis zu Ihrer Ganzzahllänge - 1 generieren. Dann holen Sie einfach Ihr int aus Ihrem Array:
quelle
Java hat eine Random-Klasse im Paket java.util. Mit ihm können Sie Folgendes tun:
Hoffe das hilft!
quelle
quelle
Sie können diesen Ansatz auch ausprobieren.
quelle
O(nlogn)
zeitlicher Komplexität, erstellen die Kopie zweimal mit insgesamt dreimal so viel Speicher wie das ursprüngliche Array, obwohl das von OP angefragte Problem mitO(1)
zeitlicher Komplexität undO(1)
Speicher gelöst werden kann ...?quelle