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.
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
É 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).
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:
rand(2)==1
já é um valor booleano?Respostas:
Um snippet declarativo usando Array # sample :
fonte
[true, false].sample
é mais rápido do querand(2) == 1
. Quando eu executei cada operação 10 milhões de vezes, orand
método era 2.179s. Osample
método era 1.645s.Que tal remover o operador ternário.
fonte
[true, false].sample
mais porque é instantaneamente óbvio o que faz.rand(2) == 1
funcionaria com ruby <1,9, o que é bom.0
e1
, você também pode usarrand(2).zero?
Eu gosto de usar
rand
:rand < 0.5
Edit : Esta resposta costumava ser lida,
rand > 0.5
masrand < 0.5
é mais tecnicamente correta.rand
retorna 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).fonte
rand > 0.3
rand < 0.7
para 70%Eu costumo usar algo assim:
Você também pode estender Integer para criar um método to_boolean:
fonte
rand(2).zero?