Najlepszy sposób na zwrócenie losowej wartości logicznej

103

Używam tego od jakiegoś czasu, aby powrócić truelub falsepodczas tworzenia fałszywych danych nasion. Zastanawiam się tylko, czy ktokolwiek ma lepszy, bardziej zwięzły lub szczegółowy sposób zwracania albo truealbo false.

rand(2) == 1 ? true : false
Chuck Bergeron
źródło
5
Zgodnie z odpowiedzią @ a'r, czy zdałeś sobie sprawę, że rand(2)==1jest to już wartość logiczna?
Phrogz

Odpowiedzi:

245

Deklaratywny fragment kodu przy użyciu przykładowej tablicy # :

random_boolean = [true, false].sample
tokland
źródło
Cholera, zupełnie zapomniałem, że opublikowałem to pytanie. Dziękuję bardzo za odpowiedź!
Chuck Bergeron
4
[true, false].samplejest szybszy niż rand(2) == 1. Kiedy wykonywane Każda operacja 10 milionów razyrand metoda była 2.179s. sampleMetoda była 1.645s.
Mirror318
[prawda, fałsz] .sample nie jest szybsza niż rand> 0,5
Ivan Castellanos,
36

Co powiesz na usunięcie operatora trójskładnikowego.

rand(2) == 1
a'r
źródło
2
Jest bardziej kompaktowy, ale bardziej mi się podoba, [true, false].sampleponieważ od razu widać, co robi. rand(2) == 1działałby z ruby ​​<1,9, co jest dobre.
Automatico
2
Ponieważ jest tylko 0i 1, możesz również użyćrand(2).zero?
Stefan
15

Lubię używać rand:

rand < 0.5

Edycja : ta odpowiedź była czytana, rand > 0.5ale rand < 0.5jest bardziej poprawna technicznie. randzwraca wynik w przedziale półotwartym [0,1), więc użycie <prowadzi do równych szans przedziałów półotwartych [0,0,5) i [0,5,1). Użycie >prowadziłoby do NIERÓWNYCH kursów z zakresu zamkniętego [0,0,5] i zakresu otwartego (.5,1).

JesseG17
źródło
4
To jest doskonałe. Metoda przykładowa daje (teoretycznie) prawdopodobieństwo 50%, ale tą metodą można skorygować to prawdopodobieństwo. Powiedz, chcę, aby 70% szans na uzyskanie prawdziwej wartości byłorand > 0.3
juliangonzalez
4
@JGonzalezD I aby uczynić go bardziej prostym i czytelnym: rand < 0.7dla 70%
TNT
4

Zwykle używam czegoś takiego:

rand(2) > 0

Możesz również rozszerzyć Integer, aby utworzyć metodę to_boolean:

class Integer
  def to_boolean
    !self.zero?
  end
end
Adam Eberlin
źródło
W ruby ​​tylko fałsz i zero są fałszywe, zdecydowanie odradzam śledzenie tego typu zachowań na małpach.
Habax
jeszcze lepiejrand(2).zero?
Jesse Novotny