2011-11-04 16 views
88

He estado usando esto durante algún tiempo para devolver true o false al generar datos de simiente falsos. Solo me pregunto si alguien tiene una forma mejor, más sucinta o más detallada de devolver true o false.La mejor manera de devolver un valor booleano aleatorio

rand(2) == 1 ? true : false 
+5

Según la respuesta de @ a'r, ¿se dio cuenta de que 'rand (2) == 1' ya es un valor booleano? – Phrogz

Respuesta

217

Un fragmento declarativa usando Array#sample:

random_boolean = [true, false].sample 
+0

Maldita sea, me olvidé por completo de haber publicado esta pregunta. ¡Muchas gracias por la respuesta de bang-on! –

+4

** '[true, false] .sample' es más rápido ** que' rand (2) == 1'. Cuando realicé cada operación * 10 millones de veces * el método 'rand' fue 2.179s. El método 'sample' fue 1.645s. – Mirror318

+0

[true, false] .sample no es más rápido que rand> 0.5 –

30

¿Qué hay de retirar el operador ternario.

rand(2) == 1 
+0

Por supuesto. Sencillez. Me gusta. –

+2

Es más compacto, pero me gusta '[verdadero, falso] .sample' mejor porque es instantáneamente obvio lo que hace. 'rand (2) == 1' funcionaría con ruby ​​<1.9, eso es bueno. – Automatico

+2

Como solo hay '0' y' 1', también podría usar 'rand (2) .zero?' – Stefan

4

que suelen utilizar algo como esto:

rand(2) > 0 

También podría extender entero a crear un método to_boolean:

class Integer 
    def to_boolean 
    !self.zero? 
    end 
end 
10

me gusta usar rand:

rand < 0.5

Editar: Esta respuesta solía leer rand > 0.5 pero rand < 0.5 es más correcto técnicamente. rand devuelve un resultado en half-open range [0,1), por lo que usar < conduce a la misma probabilidad de rangos medio abiertos [0,0.5) y [0,5,1). Usar > daría lugar a probabilidades DESIGUAL del rango cerrado [0,0.5] y rango abierto (.5,1).

+3

Esto es perfecto. El método de muestra produce (en teoría) una probabilidad de ** 50% ** pero con esta puede ajustar esa probabilidad. Diga, quiero una oportunidad de ** 70% ** de obtener un valor verdadero sería 'rand> 0.3' – juliangonzalez

+2

@JGonzalezD Y para hacerlo más sencillo y legible:' rand <0.7' para ** 70% ** – TNT

Cuestiones relacionadas