Beste Möglichkeit, einen zufälligen booleschen Wert zurückzugeben

103

Ich benutze dies seit einiger Zeit, um entweder zurückzukehren trueoder falseum gefälschte Seed-Daten zu erstellen. Ich frage mich nur, ob jemand eine bessere, prägnantere oder ausführlichere Art hat, entweder trueoder zurückzukehren false.

rand(2) == 1 ? true : false
Chuck Bergeron
quelle
5
Haben Sie gemäß der Antwort von @ a'r festgestellt, dass dies rand(2)==1bereits ein boolescher Wert ist?
Phrogz

Antworten:

245

Ein deklaratives Snippet mit Array # sample :

random_boolean = [true, false].sample
tokland
quelle
Verdammt, ich habe total vergessen, dass ich diese Frage gestellt habe. Vielen Dank für die knallharte Antwort!
Chuck Bergeron
4
[true, false].sampleist schneller als rand(2) == 1. Als ich jede Operation 10 Millionen Mal durchführterand , betrug die Methode 2,179 Sekunden. Die sampleMethode war 1.645s.
Mirror318
[wahr, falsch]. Probe ist nicht schneller als Rand> 0,5
Ivan Castellanos
36

Wie wäre es mit dem Entfernen des ternären Operators.

rand(2) == 1
a'r
quelle
2
Es ist kompakter, aber ich mag es [true, false].samplebesser, weil es sofort offensichtlich ist, was es tut. rand(2) == 1würde allerdings mit rubin <1,9 arbeiten, was gut ist.
Automatico
2
Da gibt es nur 0und 1, könnten Sie auch verwendenrand(2).zero?
Stefan
15

Ich benutze gerne rand:

rand < 0.5

Bearbeiten : Diese Antwort wurde zum Lesen verwendet rand > 0.5, rand < 0.5ist aber technisch korrekter. randGibt ein Ergebnis im halboffenen Bereich [0,1] zurück. Die Verwendung <führt also zu gleichen Quoten für halboffene Bereiche [0,0,5) und [0,5,1). Die Verwendung >würde zu UNGLEICHEN Gewinnchancen im geschlossenen Bereich [0,0,5] und im offenen Bereich (0,5,1) führen.

JesseG17
quelle
4
Dies ist perfekt. Die Stichprobenmethode ergibt (theoretisch) eine Wahrscheinlichkeit von 50%, aber mit dieser können Sie diese Wahrscheinlichkeit anpassen. Angenommen, ich möchte eine 70% ige Chance, einen echten Wert zu erhaltenrand > 0.3
juliangonzalez
4
@JGonzalezD Und um es einfacher und lesbarer zu machen: rand < 0.7für 70%
TNT
4

Normalerweise benutze ich so etwas:

rand(2) > 0

Sie können Integer auch erweitern, um eine to_boolean-Methode zu erstellen:

class Integer
  def to_boolean
    !self.zero?
  end
end
Adam Eberlin
quelle
In Ruby sind nur Falsch und Null Falsch, ich empfehle dringend, diese Art von Verhalten nicht zu monkeypatchen.
Habax
noch besser,rand(2).zero?
Jesse Novotny