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

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
Tokland
источник
Блин, совсем забыл, что разместил этот вопрос. Большое спасибо за потрясающий ответ!
Чак Бержерон
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
a'r
источник
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).

ДжессиG17
источник
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?
Джесси Новотны