Лучший способ вернуть случайное логическое значение


103

Я использую это в течение некоторого времени , чтобы вернуть либо trueили falseпри создании данных поддельных семян. Просто интересно, есть ли у кого-нибудь лучший, более лаконичный или подробный способ вернуться trueили false.

rand(2) == 1 ? true : false

5
Согласно ответу @ a'r, вы поняли, что rand(2)==1это уже логическое значение?
Phrogz

Ответы:


245

Декларативный фрагмент с использованием Array # sample :

random_boolean = [true, false].sample

Блин, совсем забыл, что разместил этот вопрос. Большое спасибо за потрясающий ответ!
Чак Бержерон

4
[true, false].sampleбыстрее чем rand(2) == 1. Когда я выполнил каждую операцию 10 миллионов разrand метод был 2.179s. sampleМетод был 1.645s.
Mirror318,

[true, false] .sample не быстрее, чем rand> 0,5
Иван Кастелланос

36

Как насчет удаления тернарного оператора.

rand(2) == 1

2
Он более компактный, но мне нравится [true, false].sampleбольше, потому что сразу видно, что он делает. rand(2) == 1будет работать с ruby ​​<1.9, что хорошо.
Automatico

2
Поскольку есть только 0и 1, вы также можете использоватьrand(2).zero?
Стефан

15

Мне нравится использовать rand:

rand < 0.5

Изменить : этот ответ раньше читали, rand > 0.5но rand < 0.5он более технически правильный. randвозвращает результат в полуоткрытом диапазоне [0,1), поэтому использование <приводит к равным шансам полуоткрытых диапазонов [0,0.5) и [0,5,1). Использование >приведет к НЕРАВНЫМ шансам закрытого диапазона [0,0.5] и открытого диапазона (.5,1).


4
Это потрясающе. Метод выборки дает (теоретически) 50% вероятность, но с его помощью вы можете скорректировать эту вероятность. Скажем, я хочу, чтобы шанс на получение истинной ценности составлял 70%,rand > 0.3
juliangonzalez

4
@JGonzalezD И чтобы сделать его более понятным и читаемым: rand < 0.7для 70%
TNT

4

Обычно я использую что-то вроде этого:

rand(2) > 0

Вы также можете расширить Integer, чтобы создать метод to_boolean:

class Integer
  def to_boolean
    !self.zero?
  end
end

В ruby ​​только false и nil являются ложными, я настоятельно рекомендую не исправлять такое поведение.
Habax

еще лучше,rand(2).zero?
Джесси Новотны
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.