Я шукаю рішення для випадкового вибору числа з цілочисельного масиву.
Наприклад, у мене є масив new int[]{1,2,3}, як я можу вибрати число випадковим чином?
Відповіді:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatorце екземплярjava.util.Random
Random()кожного разу, коли ви запускаєте функцію: генератор випадкових випадків повинен мати історію. Якщо цього не сталося, це надзвичайно передбачувано. У цьому випадку це зовсім не проблема, але слід зазначити, що array[(int)(System.currentTimeMillis() % array.length)]вона настільки ж гарна, як пропоноване рішення.
new Random()намагається створити екземпляр, який має інше насіння, ніж будь-яке раніше створене Random. Ваш підхід розірветься жахливо, лише двічі викликавши функцію за короткий час.
gcd(array.length,clockAccuracy)!=1
Ви можете використовувати генератор випадкових випадків, щоб створити випадковий індекс і повернути елемент за цим індексом:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Якщо ви збираєтеся отримувати випадковий елемент кілька разів, ви хочете, щоб генератор випадкових чисел ініціалізувався лише один раз.
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)];
}
}
Якщо ви вибираєте випадкові елементи масиву, які повинні бути непередбачуваними, вам слід використовувати java.security.SecureRandom, а не Random. Це гарантує, що якщо хтось знає кілька останніх виборів, вони не матимуть переваги в угадуванні наступного.
Якщо ви хочете вибрати випадкове число з масиву Object, використовуючи загальні засоби, ви можете визначити метод для цього (Source Avinash R у елементі Random з масиву рядків ):
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)];
}
}
Ви також можете використовувати
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()повертає doubleміж 0.0(включно) до 1.0(ексклюзивно)
Помноживши це на, array.lengthви отримаєте doubleміж 0.0(включно) та array.length(ексклюзивно)
Кастинг intокруглюється вниз, даючи вам і ціле число між 0(включно) та array.length-1(включно)
Оскільки у вас Java 8, іншим рішенням є використання Stream API.
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
Де 1найнижчий генерований int (включно) та 500найвищий (ексклюзивний). limitозначає, що ваш потік матиме довжину 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]));
Випадковий - з java.utilупаковки.
Погляньте на це питання:
Як створити випадкові цілі числа в межах певного діапазону в Java?
Ви захочете згенерувати випадкове число від 0 до вашої цілочисельної довжини - 1. Тоді просто отримайте свій int з вашого масиву:
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)]);
}
}
Ви також можете спробувати такий підхід ..
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)часовою складністю, робите його копію двічі, використовуючи загально в 3 рази більше пам'яті, ніж початковий масив, хоча проблема, про яку запитував ОП, може бути вирішена за допомогою O(1)складності часу та O(1)пам'яті ...?
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)]);
});
}
}