Szukam rozwiązania, aby wybrać liczbę losowo z tablicy liczb całkowitych.
Na przykład mam tablicę new int[]{1,2,3}, jak mogę wybrać losowo liczbę?
Odpowiedzi:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatorjest to przykładjava.util.Random
Random()każdym razem, gdy uruchamiasz funkcję: generator losowy ma mieć historię. Jeśli tak się nie stało, jest to niezwykle przewidywalne. W tym przypadku nie stanowi to żadnego problemu - ale należy wspomnieć, że array[(int)(System.currentTimeMillis() % array.length)]jest tak samo dobre, jak proponowane rozwiązanie.
new Random()próbuje utworzyć instancję, która ma inne ziarno niż jakiekolwiek poprzednio utworzone Random. Twoje podejście przerwałoby okropnie po prostu wywołanie funkcji dwukrotnie w krótkim czasie.
gcd(array.length,clockAccuracy)!=1
Możesz użyć generatora Random, aby wygenerować losowy indeks i zwrócić element o tym indeksie:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Jeśli masz zamiar wielokrotnie otrzymywać losowy element, upewnij się, że generator liczb losowych został zainicjowany tylko raz.
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)];
}
}
Jeśli wybierasz losowe elementy tablicy, które muszą być nieprzewidywalne, powinieneś użyć java.security.SecureRandom zamiast Random. To gwarantuje, że jeśli ktoś zna kilka ostatnich typów, nie będzie miał przewagi w odgadywaniu następnego.
Jeśli chcesz wybrać losową liczbę z tablicy Object przy użyciu typów ogólnych, możesz zdefiniować metodę, aby to zrobić (Source 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)];
}
}
Możesz także użyć
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()zwraca wartość doublemiędzy 0.0(włącznie) do 1.0(wyłączność)
Pomnożenie tego przez array.lengthdaje wartość doublemiędzy 0.0(włącznie) i array.length(ekskluzywnie)
Rzutowanie na intzaokrągli w dół, dając ci i liczbę całkowitą między 0(włącznie) i array.length-1(włącznie)
Ponieważ masz java 8, innym rozwiązaniem jest użycie Stream API.
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
Gdzie 1jest najniższą wygenerowaną 500liczbą int (włącznie) i najwyższą (wyłączną). limitoznacza, że Twój strumień będzie miał długość 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]));
Losowo pochodzi z java.utilpaczki.
Spójrz na to pytanie:
Jak wygenerować losowe liczby całkowite z określonego zakresu w języku Java?
Będziesz chciał wygenerować losową liczbę od 0 do długości twoich liczb całkowitych - 1. Następnie po prostu pobierz swój int z tablicy:
myArray[myRandomNumber];
Możesz także wypróbować to podejście.
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)złożonością czasową, tworzysz jej kopię dwukrotnie, używając w sumie 3 razy więcej pamięci niż początkowa tablica, nawet jeśli problem, o który pytał OP, można rozwiązać za pomocą O(1)złożoności czasowej i O(1)pamięci ...?
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)]);
}
}
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)]);
});
}
}