Risposte:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatorè un esempio dijava.util.Random
Random()ogni volta che esegui la funzione: il generatore casuale dovrebbe avere una cronologia. In caso contrario, è estremamente prevedibile. Non è affatto un problema in questo caso, ma va detto che array[(int)(System.currentTimeMillis() % array.length)]è buono quanto la soluzione proposta.
new Random()cerca di creare un'istanza che abbia un seme diverso da qualsiasi altra creata in precedenza Random. Il tuo approccio si interromperà orribilmente solo invocando la funzione due volte in breve tempo.
gcd(array.length,clockAccuracy)!=1
Puoi utilizzare il generatore casuale per generare un indice casuale e restituire l'elemento a quell'indice:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Se stai per ottenere un elemento casuale più volte, assicurati che il tuo generatore di numeri casuali sia inizializzato solo una volta.
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)];
}
}
Se stai scegliendo elementi di array casuali che devono essere imprevedibili, dovresti usare java.security.SecureRandom piuttosto che Random. Ciò garantisce che se qualcuno conosce le ultime scelte, non avrà alcun vantaggio nell'indovinare il prossimo.
Se stai cercando di scegliere un numero casuale da un array di oggetti utilizzando generici, puoi definire un metodo per farlo (Fonte Avinash R in Random element from 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)];
}
}
Puoi anche usare
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()restituisce un doubletra 0.0(compreso) e 1.0(esclusivo)
Moltiplicando questo valore per si array.lengthottiene un valore doublecompreso tra 0.0(inclusivo) e array.length(esclusivo)
Il cast a intverrà arrotondato per difetto fornendo un numero intero compreso tra 0(incluso) e array.length-1(incluso)
Dato che hai java 8, un'altra soluzione è usare l'API Stream.
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
Dove 1è il più basso int generato (incluso) ed 500è il più alto (esclusivo). limitsignifica che il tuo stream avrà una lunghezza di 500.
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]));
Random proviene dal java.utilpacchetto.
Dai un'occhiata a questa domanda:
Come posso generare numeri interi casuali all'interno di un intervallo specifico in Java?
Dovrai generare un numero casuale da 0 alla lunghezza dei tuoi numeri interi - 1. Quindi ottieni semplicemente il tuo int dal tuo 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)]);
}
}
Puoi anche provare questo approccio ..
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)complessità temporale, ne fai la copia due volte utilizzando il totale di 3 volte più memoria dell'array iniziale, anche se il problema che OP ha chiesto può essere risolto con la O(1)complessità temporale e la O(1)memoria ...?
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)]);
});
}
}