ランダムなブール値を返す最良の方法


103

私はこれを返すために、trueまたはfalse偽のシードデータを構築するときに、これをしばらく使用しています。またはのどちらtrueかを返すためのより優れた、より簡潔なまたは冗長な方法があるかどうか疑問に思っていますfalse

rand(2) == 1 ? true : false

5
@ a'rの回答によれば、これrand(2)==1はすでにブール値であることに気付きましたか?
Phrogz

回答:


245

Array#sampleを使用した宣言スニペット:

random_boolean = [true, false].sample

くそー、私はこの質問を投稿するのを完全に忘れていました。前向きな答えを本当にありがとう!
チャックベルジェロン

4
[true, false].sampleより速いですrand(2) == 1。各操作を1,000万回実行したときのrand方法は2.179秒でした。sampleこの方法は、1.645sました。
Mirror318 2016年

[true、false] .sampleはrand> 0.5より高速ではありません
Ivan Castellanos

36

三項演算子を削除するのはどうですか。

rand(2) == 1

2
それはよりコンパクトですが[true, false].sample、それが何をするのか即座に明らかであるので、私はより好きです。rand(2) == 1Ruby 1.9未満でも動作しますが、これは良いことです。
Automatico、

2
0and しかないので1、次も使用できますrand(2).zero?
Stefan

15

私は使いたいrand

rand < 0.5

編集:この回答は以前は読んでrand > 0.5いましたrand < 0.5が、より技術的に正しいです。ハーフオープン範囲 [0,1)のrand結果を返すため、使用すると、ハーフオープン範囲[0,0.5)と[0.5,1)のオッズが等しくなります。使用すると、閉じた範囲[0,0.5]と開いた範囲(.5,1)の不等確率が発生します。<>


4
これは完璧です。サンプルの方法では、(理論的には)50%の確率が生成されますが、この方法では、その確率を調整できます。rand > 0.3
たとえば

4
@JGonzalezDそしてそれをより簡単で読みやすくするrand < 0.7ために:70%
TNT

4

私は通常、次のようなものを使用します。

rand(2) > 0

Integerを拡張してto_booleanメソッドを作成することもできます。

class Integer
  def to_boolean
    !self.zero?
  end
end

Rubyでは、falseとnilのみがfalseであり、この種の動作をモンキーパッチしないことを強くお勧めします。
Habax

さらに良いことに、rand(2).zero?
Jesse Novotny
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.