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

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

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

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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.