Если у меня есть перечисление как это:
public enum Letter {
A,
B,
C,
//...
}
Каков наилучший способ выбрать один случайным образом? Это не должно быть пуленепробиваемым качеством продукции, но было бы неплохо равномерное распределение.
Я мог бы сделать что-то вроде этого
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
Но есть ли лучший способ? Я чувствую, что это то, что было решено раньше.
Letter.values()
должен создавать новую копиюLetter
массива внутренних значений.Ответы:
Единственное, что я хотел бы предложить, это кэшировать результат,
values()
потому что каждый вызов копирует массив. Кроме того, не создавайтеRandom
каждый раз. Держи один. Кроме того, что вы делаете, это хорошо. Так:источник
values()
массив в неизменяемый список.VALUES
Объект уже инкапсулированные в силу декларируемыхprivate
. Было бы проще и эффективнее сделать этоprivate static final Letter[] VALUES = ...
.Один метод - это все, что вам нужно для всех ваших случайных перечислений:
Который вы будете использовать:
Я также предпочитаю использовать SecureRandom как:
источник
Объединяя предложения Клетуса и Гелиоса ,
Редактировать: Ой, я забыл параметр ограниченного типа
<E extends Enum<E>>
.источник
E extends Enum<E>
?new RandomEnum<>(Season.class)
это разрешено начиная с Java 7.RandomEnum
класс был бы полезен в качестве микро-библиотеки, если вы хотите объединить его и опубликовать в центральной.Одна линия
источник
Согласитесь со Stphen C & helios. Лучший способ получить случайный элемент из Enum:
источник
источник
Это, вероятно, самый краткий способ достижения вашей цели. Все, что вам нужно сделать, это позвонить,
Letter.getRandom()
и вы получите случайное перечисление.источник
Простое решение Kotlin
random()
является функцией расширения по умолчанию, включенной в базу Kotlin дляCollection
объекта. Kotlin Документация СсылкаЕсли вы хотите упростить это с помощью функции расширения, попробуйте это:
Чтобы сделать это статичным в вашем классе enum. Убедитесь, что вы импортировали
my.package.random
файл enumЕсли вам нужно сделать это из экземпляра enum, попробуйте это расширение
источник
Вероятно, проще всего иметь функцию для выбора случайного значения из массива. Это более общее и простое решение.
Звоните так:
источник
Вот версия, которая использует shuffle и потоки
источник
Если вы делаете это для тестирования, вы можете использовать Quickcheck ( это порт Java, над которым я работал ).
Он поддерживает все типы примитивов, состав типов, коллекции, различные функции распределения, границы и т. Д. Он имеет поддержку для бегунов, выполняющих несколько значений:
Преимущество Quickcheck заключается в том, что вы можете определять тесты на основе спецификации, в которой обычный TDD работает со сценариями.
источник
Легко реализовать случайную функцию в перечислении.
а потом вы звоните из класса вам нужно это так
источник
Я бы использовал это:
источник
Я предполагаю, что этот метод однострочного возврата достаточно эффективен, чтобы использовать его в такой простой работе:
источник