Вопрос-ответ

How to randomly pick an element from an array

Как случайным образом выбрать элемент из массива

Я ищу решение для случайного выбора числа из массива целых чисел.

Например, у меня есть массив new int[]{1,2,3}, как я могу случайным образом выбрать число?

Переведено автоматически
Ответ 1
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
Ответ 2

Вы можете использовать генератор случайных чисел для генерации случайного индекса и возврата элемента с этим индексом:

//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Ответ 3

Если вы собираетесь получать случайный элемент несколько раз, вы хотите убедиться, что ваш генератор случайных чисел инициализирован только один раз.

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 . Это гарантирует, что если кто-то знает последние несколько вариантов выбора, у него не будет преимущества в угадывании следующего.

Если вы хотите выбрать случайное число из массива объектов, используя общие методы, вы могли бы определить метод для этого (источник Avinash R в 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)];
}
}
Ответ 4

В Java 7 можно использовать ThreadLocalRandom.


Генератор случайных чисел, изолированный от текущего потока. Подобно глобальному генератору случайных чисел, используемому классом Math, ThreadLocalRandom инициализируется внутренне сгенерированным начальным значением, которое иным образом не может быть изменено. Когда это применимо, использование ThreadLocalRandom вместо совместно используемых случайных объектов в параллельных программах, как правило, сопряжено с гораздо меньшими накладными расходами и конфликтами. Использование ThreadLocalRandom особенно уместно, когда несколько задач (например, каждая из задач ForkJoinTask) параллельно используют случайные числа в пулах потоков.


public static int getRandomElement(int[] arr){
return arr[ThreadLocalRandom.current().nextInt(arr.length)];
}

//Example Usage:
int[] nums = {1, 2, 3, 4};
int randNum = getRandomElement(nums);
System.out.println(randNum);

Также можно написать универсальную версию, но она не будет работать для примитивных массивов.

public static <T> T getRandomElement(T[] arr){
return arr[ThreadLocalRandom.current().nextInt(arr.length)];
}

//Example Usage:
String[] strs = {"aa", "bb", "cc"};
String randStr = getRandomElement(strs);
System.out.println(randStr);
2023-09-27 13:31 java