Melhor maneira de retornar um valor booleano aleatório

103

Venho usando isso há algum tempo para retornar trueou falseao construir dados de semente falsos. Apenas me perguntando se alguém tem uma maneira melhor, mais sucinta ou prolixa de retornar trueou false.

rand(2) == 1 ? true : false
Chuck Bergeron
fonte
5
Pela resposta de @ a'r, você percebeu que rand(2)==1já é um valor booleano?
Phrogz

Respostas:

245

Um snippet declarativo usando Array # sample :

random_boolean = [true, false].sample
Tokland
fonte
Droga, esqueci totalmente que postei essa pergunta. Muito obrigado pela resposta rápida!
Chuck Bergeron
4
[true, false].sampleé mais rápido do que rand(2) == 1. Quando eu executei cada operação 10 milhões de vezes, o randmétodo era 2.179s. O samplemétodo era 1.645s.
Mirror318
[verdadeiro, falso] .sample não é mais rápido do que rand> 0,5
Ivan Castellanos
36

Que tal remover o operador ternário.

rand(2) == 1
a'r
fonte
2
É mais compacto, mas gosto [true, false].samplemais porque é instantaneamente óbvio o que faz. rand(2) == 1funcionaria com ruby ​​<1,9, o que é bom.
Automatico
2
Como há apenas 0e 1, você também pode usarrand(2).zero?
Stefan,
15

Eu gosto de usar rand:

rand < 0.5

Edit : Esta resposta costumava ser lida, rand > 0.5mas rand < 0.5é mais tecnicamente correta. randretorna um resultado na faixa semiaberta [0,1), então o uso <leva a chances iguais de faixas semiabertas [0,0.5) e [0,5,1). O uso >levaria a chances UNEQUAL de intervalo fechado [0,0.5] e intervalo aberto (.5,1).

JesseG17
fonte
4
Isto é perfeito. O método de amostra produz (em teoria) uma probabilidade de 50%, mas com este você pode ajustar essa probabilidade. Digamos, eu quero que uma chance de 70% de obter um valor verdadeiro seriarand > 0.3
juliangonzalez
4
@JGonzalezD E para torná-lo mais simples e legível: rand < 0.7para 70%
TNT
4

Eu costumo usar algo assim:

rand(2) > 0

Você também pode estender Integer para criar um método to_boolean:

class Integer
  def to_boolean
    !self.zero?
  end
end
Adam Eberlin
fonte
Em ruby, apenas false e nil são falsey, recomendo veementemente não corrigir esse tipo de comportamento.
Habax
melhor ainda,rand(2).zero?
Jesse Novotny