2011-11-04 20 views
88

L'ho usato per un po 'di tempo per restituire true o false durante la creazione di dati di seme falso. Mi chiedo solo se qualcuno ha un modo migliore, più succinto o verboso di restituire true o false.Il modo migliore per restituire un valore booleano casuale

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

Per la risposta di @ a'r, hai capito che 'rand (2) == 1' è già un valore booleano? – Phrogz

risposta

217

Un frammento dichiarativo utilizzando Array#sample:

random_boolean = [true, false].sample 
+0

Dannazione, ho completamente dimenticato di aver postato questa domanda. Grazie mille per la risposta bang-on! –

+4

** '[true, false] .sample' è più veloce ** di' rand (2) == 1'. Quando eseguivo ogni operazione * 10 milioni di volte * il metodo 'rand' era 2.179s. Il metodo 'sample' era 1,645s. – Mirror318

+0

[true, false]. Campione non è più veloce di rand> 0,5 –

30

Come sulla rimozione l'operatore ternario.

rand(2) == 1 
+0

Naturalmente. Semplicità. Mi piace. –

+2

È più compatto, ma mi piace '[true, false] .sample' meglio perché è immediatamente evidente ciò che fa. 'rand (2) == 1' funzionerebbe con ruby ​​<1.9, che è buono. – Automatico

+2

Dato che ci sono solo '0' e' 1', potresti anche usare 'rand (2) .zero?' – Stefan

4

io di solito uso qualcosa di simile:

rand(2) > 0 

Si potrebbe anche estendersi Integer per creare un metodo to_boolean:

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

Mi piace usare rand:

rand < 0.5

Modifica: questa risposta era utilizzata per leggere rand > 0.5 ma rand < 0.5 è tecnicamente più corretto. rand restituisce un risultato nello half-open range [0,1), pertanto l'utilizzo di < determina uguali quote di intervalli semiaperti [0,0,5) e [0,5,1). L'utilizzo di > porterebbe a odds UNEQUAL dell'intervallo chiuso [0,0.5] e intervallo aperto (.5,1).

+3

Questo è perfetto. Il metodo di campionamento produce (in teoria) una probabilità ** 50% ** ma con questa puoi aggiustare quella probabilità. Dite, voglio una ** 70% ** possibilità di ottenere un valore vero sarebbe 'rand> 0.3' – juliangonzalez

+2

@JGonzalezD E per renderlo più semplice e leggibile:' rand <0.7' per ** 70% ** – TNT

Problemi correlati