Если вы выбираете случайные элементы массива, которые должны быть непредсказуемыми, вам следует использовать java.security .SecureRandom, а не Random . Это гарантирует, что если кто-то знает последние несколько вариантов выбора, у него не будет преимущества в угадывании следующего.
Если вы хотите выбрать случайное число из массива объектов, используя общие методы, вы могли бы определить метод для этого (источник Avinash R в Random element from string array):
Генератор случайных чисел, изолированный от текущего потока. Подобно глобальному генератору случайных чисел, используемому классом Math, ThreadLocalRandom инициализируется внутренне сгенерированным начальным значением, которое иным образом не может быть изменено. Когда это применимо, использование ThreadLocalRandom вместо совместно используемых случайных объектов в параллельных программах, как правило, сопряжено с гораздо меньшими накладными расходами и конфликтами. Использование ThreadLocalRandom особенно уместно, когда несколько задач (например, каждая из задач ForkJoinTask) параллельно используют случайные числа в пулах потоков.