Respostas:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatoré uma instância dejava.util.Random
Random()cada vez que você executasse a função: o gerador aleatório deveria ter histórico. Se não, é extremamente previsível. Não é um problema neste caso - mas deve ser mencionado que array[(int)(System.currentTimeMillis() % array.length)]é tão bom quanto a solução proposta.
new Random()tenta criar uma instância que possui uma semente diferente de qualquer outra criada anteriormente Random. Sua abordagem seria horrível apenas invocando a função duas vezes em um curto espaço de tempo.
gcd(array.length,clockAccuracy)!=1
Você pode usar o gerador Random para gerar um índice aleatório e retornar o elemento nesse índice:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Se você for obter um elemento aleatório várias vezes, certifique-se de que o gerador de números aleatórios seja inicializado apenas uma vez.
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 estiver escolhendo elementos de array aleatórios que precisam ser imprevisíveis, você deve usar java.security.SecureRandom em vez de Random. Isso garante que, se alguém souber as últimas escolhas, não terá vantagem em adivinhar a próxima.
Se você deseja escolher um número aleatório de uma matriz Object usando genéricos, pode definir um método para fazer isso (Fonte Avinash R no elemento Random da matriz de string ):
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)];
}
}
Você também pode usar
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()retorna um doubleentre 0.0(inclusivo) a 1.0(exclusivo)
Multiplicar isso por array.lengthdá a você um valor doubleentre 0.0(inclusivo) e array.length(exclusivo)
Cast para intarredondará para baixo, fornecendo a você um número inteiro entre 0(inclusivo) e array.length-1(inclusivo)
Como você tem o java 8, outra solução é usar a API Stream.
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
Onde 1é o menor int gerado (inclusivo) e 500é o maior (exclusivo). limitsignifica que seu stream terá uma duração de 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 é do java.utilpacote.
Dê uma olhada nesta questão:
Como faço para gerar inteiros aleatórios dentro de um intervalo específico em Java?
Você vai querer gerar um número aleatório de 0 até o comprimento de seus inteiros - 1. Em seguida, basta obter o seu int de sua matriz:
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)]);
}
}
Você também pode tentar essa abordagem.
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)complexidade de tempo, faz a cópia dela duas vezes usando o total de 3 vezes mais memória do que o array inicial, embora o problema que o OP perguntou possa ser resolvido com O(1)complexidade de tempo e O(1)memória ...?
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)]);
});
}
}