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

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

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

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).


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.