Antworten:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatoreine 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 dies array[(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 hat Random. 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:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Wenn Sie mehrmals ein zufälliges Element erhalten, möchten Sie sicherstellen, dass Ihr Zufallszahlengenerator nur einmal initialisiert wird.
import java.util.Random;
public class RandArray {
private int[] items = new int[]{1,2,3};
private Random rand = new Random();
public int getRandArrayElement(){
return items[rand.nextInt(items.length)];
}
}
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;
public class RandArray {
private static Random rand = new Random();
private static <T> T randomFrom(T... items) {
return items[rand.nextInt(items.length)];
}
}
Verwenden Sie die Zufallsklasse :
int getRandomNumber(int[] arr)
{
return arr[(new Random()).nextInt(arr.length)];
}
Sie können auch verwenden
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()gibt ein doublezwischen 0.0(inklusive) bis 1.0(exklusiv) zurück
Wenn Sie dies mit multiplizieren, erhalten array.lengthSie doublezwischen 0.0(inklusive) und array.length(exklusiv)
Casting to intwird abrunden und gibt Ihnen eine ganze Zahl zwischen 0(inklusive) und array.length-1(inklusive)
Da Sie Java 8 haben, besteht eine andere Lösung darin, die Stream-API zu verwenden.
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
Wobei 1das niedrigste int (einschließlich) und 500das höchste (exklusiv) generiert wird. limitbedeutet, dass Ihr Stream eine Länge von 500 hat.
int[] list = new int[] {1,2,3,4,5,6};
new Random().ints(0, list.length).limit(10).forEach(p -> System.out.println(list[p]));
Zufall ist aus java.utilPaket.
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:
myArray[myRandomNumber];
package workouts;
import java.util.Random;
/**
*
* @author Muthu
*/
public class RandomGenerator {
public static void main(String[] args) {
for(int i=0;i<5;i++){
rndFunc();
}
}
public static void rndFunc(){
int[]a= new int[]{1,2,3};
Random rnd= new Random();
System.out.println(a[rnd.nextInt(a.length)]);
}
}
Sie können diesen Ansatz auch ausprobieren.
public static <E> E[] pickRandom_(int n,E ...item) {
List<E> copy = Arrays.asList(item);
Collections.shuffle(copy);
if (copy.size() > n) {
return (E[]) copy.subList(0, n).toArray();
} else {
return (E[]) copy.toArray();
}
}
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 ...?
package io.github.baijifeilong.tmp;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Stream;
/**
* Created by BaiJiFeiLong@gmail.com at 2019/1/3 下午7:34
*/
public class Bar {
public static void main(String[] args) {
Stream.generate(() -> null).limit(10).forEach($ -> {
System.out.println(new String[]{"hello", "world"}[ThreadLocalRandom.current().nextInt(2)]);
});
}
}