Meilleur moyen de renvoyer une valeur booléenne aléatoire

103

Je l'utilise depuis un certain temps pour retourner trueou falsepour créer de fausses données de semences. Je me demande simplement si quelqu'un a une meilleure façon, plus succincte ou plus détaillée de renvoyer l'un trueou l' autre false.

rand(2) == 1 ? true : false
Chuck Bergeron
la source
5
D'après la réponse de @ a'r, avez-vous réalisé que rand(2)==1c'est déjà une valeur booléenne?
Phrogz

Réponses:

245

Un extrait de code déclaratif utilisant l'exemple Array # :

random_boolean = [true, false].sample
tokland
la source
Merde, j'ai totalement oublié que j'ai posté cette question. Merci beaucoup pour la réponse!
Chuck Bergeron
4
[true, false].sampleest plus rapide que rand(2) == 1. Lorsque j'ai effectué chaque opération 10 millions de fois, la randméthode était de 2,179 s. La sampleméthode était de 1,645 s.
Mirror318 du
[true, false] .sample is not fast than rand> 0.5
Ivan Castellanos
36

Que diriez-vous de supprimer l'opérateur ternaire.

rand(2) == 1
a'r
la source
2
Il est plus compact, mais j'aime [true, false].samplemieux car ce qu'il fait est immédiatement évident. rand(2) == 1fonctionnerait avec ruby ​​<1,9, ce qui est bien.
Automatico
2
Puisqu'il n'y a que 0et 1, vous pouvez également utiliserrand(2).zero?
Stefan
15

J'aime utiliser rand:

rand < 0.5

Edit : Cette réponse lisait rand > 0.5mais rand < 0.5est plus techniquement correcte. randrenvoie un résultat dans la plage semi-ouverte [0,1), donc l'utilisation <conduit à des cotes égales des plages semi-ouvertes [0,0.5) et [0.5,1). L'utilisation >conduirait à des cotes INÉGALES de la plage fermée [0,0.5] et de la plage ouverte (.5,1).

JesseG17
la source
4
C'est parfait. La méthode d'échantillonnage produit (en théorie) une probabilité de 50%, mais avec celle-ci, vous pouvez ajuster cette probabilité. Dites, je veux une chance de 70% d'obtenir une valeur réelle seraitrand > 0.3
juliangonzalez
4
@JGonzalezD Et pour le rendre plus simple et lisible: rand < 0.7pour 70%
TNT
4

J'utilise généralement quelque chose comme ceci:

rand(2) > 0

Vous pouvez également étendre Integer pour créer une méthode to_boolean:

class Integer
  def to_boolean
    !self.zero?
  end
end
Adam Eberlin
la source
En ruby, seuls faux et nil sont faux, je recommande fortement de ne pas faire de monkeypatch ce genre de comportement.
Habax
mieux encore,rand(2).zero?
Jesse Novotny