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

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

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

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.