La mejor forma de devolver un valor booleano aleatorio

103

He estado usando esto durante algún tiempo para regresar trueo falseal crear datos de semillas falsos. Sólo me preguntaba si alguien tiene una mejor manera, más conciso o detallado de volver, ya sea trueo false.

rand(2) == 1 ? true : false
Chuck Bergeron
fuente
5
Según la respuesta de @ a'r, ¿se dio cuenta de que rand(2)==1ya es un valor booleano?
Phrogz

Respuestas:

245

Un fragmento declarativo que usa Array # sample :

random_boolean = [true, false].sample
tokland
fuente
Maldita sea, olvidé por completo que publiqué esta pregunta. ¡Muchas gracias por la respuesta explosiva!
Chuck Bergeron
4
[true, false].samplees más rápido que rand(2) == 1. Cuando realicé cada operación 10 millones de veces, el randmétodo fue 2.179s. El samplemétodo fue 1.645s.
Mirror318
[verdadero, falso] .sample no es más rápido que rand> 0.5
Ivan Castellanos
36

¿Qué tal eliminar el operador ternario?

rand(2) == 1
Arkansas
fuente
2
Es más compacto, pero me gusta [true, false].samplemás porque es obvio al instante lo que hace. rand(2) == 1Sin embargo, funcionaría con ruby ​​<1.9, lo cual es bueno.
Automático
2
Como solo hay 0y 1, también podría usarrand(2).zero?
Stefan
15

Me gusta usar rand:

rand < 0.5

Editar : esta respuesta solía leer rand > 0.5pero rand < 0.5es más técnicamente correcta. randdevuelve un resultado en el rango semiabierto [0,1), por lo que el uso <conduce a probabilidades iguales de rangos semiabiertos [0,0.5) y [0.5,1). El uso >conduciría a probabilidades DESIGUALES del rango cerrado [0,0.5] y del rango abierto (.5,1).

JesseG17
fuente
4
Esto es perfecto. El método de muestra produce (en teoría) una probabilidad del 50% pero con este puedes ajustar esa probabilidad. Digamos, quiero un 70% de posibilidades de obtener un valor realrand > 0.3
juliangonzalez
4
@JGonzalezD Y para hacerlo más sencillo y legible: rand < 0.7al 70%
TNT
4

Normalmente uso algo como esto:

rand(2) > 0

También puede extender Integer para crear un método to_boolean:

class Integer
  def to_boolean
    !self.zero?
  end
end
Adam Eberlin
fuente
En ruby, solo false y nil son falsos, recomiendo encarecidamente no parchear este tipo de comportamiento.
Habax
mejor aún,rand(2).zero?
Jesse Novotny