Il modo migliore per restituire un valore booleano casuale


103

Lo sto usando da un po 'di tempo per restituire uno trueo falsedurante la creazione di dati seed falsi. Mi chiedevo solo se qualcuno ha un modo migliore, più succinto o prolisso per restituire l'uno trueo l'altro false.

rand(2) == 1 ? true : false

5
Secondo la risposta di @ a'r, ti sei reso conto che rand(2)==1è già un valore booleano?
Phrogz

Risposte:


245

Uno snippet dichiarativo che utilizza l' esempio Array # :

random_boolean = [true, false].sample

Dannazione, mi ero completamente dimenticato di aver postato questa domanda. Grazie mille per la risposta eccezionale!
Chuck Bergeron

4
[true, false].sampleè più veloce di rand(2) == 1. Quando ho eseguito ogni operazione 10 milioni di volte, il randmetodo era di 2,179 secondi. Il samplemetodo era di 1,645 secondi.
Mirror318

[vero, falso] .sample non è più veloce di rand> 0,5
Ivan Castellanos

36

Che ne dici di rimuovere l'operatore ternario.

rand(2) == 1

2
È più compatto, ma mi piace di [true, false].samplepiù perché è immediatamente ovvio quello che fa. rand(2) == 1funzionerebbe con ruby ​​<1.9, il che è positivo.
Automatico

2
Dato che c'è solo 0e 1, potresti anche usarerand(2).zero?
Stefan il

15

Mi piace usare rand:

rand < 0.5

Modifica : questa risposta era letta rand > 0.5ma rand < 0.5è tecnicamente più corretta. randrestituisce un risultato nell'intervallo semiaperto [0,1), quindi l'uso <porta a quote uguali per intervalli semiaperti [0,0.5) e [0,5,1). L'uso >porterebbe a quote DISUGUALI del campo chiuso [0,0.5] e del campo aperto (.5,1).


4
Questo è perfetto. Il metodo di esempio produce (in teoria) una probabilità del 50%, ma con questo puoi regolare quella probabilità. Diciamo, voglio una probabilità del 70% di ottenere un valore reale sarebberand > 0.3
juliangonzalez

4
@JGonzalezD E per renderlo più chiaro e leggibile: rand < 0.7per il 70%
TNT

4

Di solito uso qualcosa del genere:

rand(2) > 0

Puoi anche estendere Integer per creare un metodo to_boolean:

class Integer
  def to_boolean
    !self.zero?
  end
end

In ruby, solo false e nil sono false, consiglio caldamente di non imitare questo tipo di comportamento.
Habax

meglio ancora,rand(2).zero?
Jesse Novotny
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.