2009-05-19 5 views
1

今、私はコインフリップをシミュレートする方がいいですか?

return 'Heads' if Math.random() < 0.5 

はこれを行うには良い方法はありますか?

おかげ

編集:戻り値を無視し、「より良い」とは、正確な50-50確率を意味してください。

+0

どのような言語ですか?なぜ文字列を返すのですか? –

+0

どのように「より良い」? random()が0 <= num <1の浮動小数点数を生成すると仮定すると、正確な確率は50-50です。 –

+2

「エッジコイン」はどうですか? ;) – DisgruntledGoat

答えて

-4

は、私は本当にあなたが使用している言語を知らないが、乱数が2で割り切れるであれば、それはそれは尾で、その後でない場合、それは頭で

return 'Heads' if Math.random() * 100 mod 2 = 0 

を試してみてください。

+1

これは実際には動作しないかもしれません。いくつかのRNGの左端ビットは右端ビットよりランダムである。 –

+0

このような手法を使用する場合、random()が上位ビットと同じように下位ビットでランダムであることを確認してください。 rand(3)のノートを参照してください。linux.die.net/man/3/rand – Stephan202

+0

これは、98が52と同じくらい有効で、02と同じように有効であるため、mod 2を使用した理由です。あなたがモード2を使用する場合は、偶数と奇数の間でかなり均等にブレークする必要があります。 –

9

いつも死んだシンプルがあります。

コイン= rand(1);

多くのスクリプト言語では、これは0とargの間のランダムなintを与えるので、1を渡すと0または1(頭や尾)が得られます。

+1

この可処分性が50%であるか? – unj2

+4

私はそれを保証することはできないと思います。 – ChristianLinnell

+0

Tal Pressmanは「正確な50-50チャンス」を得ることができると言いました。それは間違っていますか? – unj2

0

奇数と偶数を区別してみてください。また、文字列ではなく、列挙値(またはブール値)を返します。

4

あなたが持っているものは私がやる方法です。 0.0 < = Math.random()< 1.0と同じように、(Math.random()< 0.5)は、Math.random()が0.0と0.4999の間にあるときに頭を出します。それは0.5と0.999の間です...それはあなたが得ることができる公正なコインフリップです。

もちろん、私はMath.random()の良い実装を前提としています。

+0

<=何か違いはありますか? – unj2

+2

はい、<=は一方の側または他方の側に偏って行います(どちらの場合でも、この場合は頭になります)。 0.0〜0.5は、0.5000001〜0.9999999よりわずかに広い範囲です。 –

+0

比較や浮動小数点数を扱う際には、誤った点を覚えておいてください。 – strager

7

Numerical Recipes in Cは、組み込みの乱数ジェネレータを信頼できないと言っています。おそらく、本の中に示されているアルゴリズムを関数ran1()として実装することができます。このアルゴリズムは、1992年のランダム性に関する既知の統計テストのすべてを、約1コール未満で渡します。

ran1()アルゴリズムの背後にある基本的な考え方は、乱数ジェネレータの出力にシャッフルを追加して、低次のシリアル相関を減らすことです。彼らはコンピュータ・プログラミング第2巻の芸術のセクション3.2-3.3からのベイ・ダーラム・シャッフルを使用しますが、私はFisher-Yates shuffleも使用できると思います。

あなたがより多くのランダムな値が必要な場合は、同じ文書は、(私の推測では、2.3×10 の期間に基づいて)少なくとも10 値のために良いことがありますジェネレータ(RAN2)を提供します。線形合同ジェネレータがあなたに何らかの問題を与えるなら、乱数を生成するために別の方法を使用する関数(ran3)も提供します。

< 0.5テストでは、これらの機能のいずれかを使用して、均一な分布が得られると確信できます。

+0

Numerical Recipesライセンス(書籍に含まれ、nrbook.comウェブサイトに掲載されている)は、ソースコードの再配布を特に禁止しているので、ran1コードは数値レシピではないことを願っています。 nr.com/licenses/redistribute.html – las3rjock

+1

善良な主人、私は以前にそれを見たことがありません。オープンソースプロジェクトではコードの完全な本は使用できません...うわー。 – fenomas

+0

はい、本当にありがとうございます。私は翻訳を削除しました。乱雑な乱数生成が必要な場合は、自分の本のコピーを購入し、翻訳を自分で行う必要があります。 – garethm

0

私は評判がないので人の投稿にコメントすることはできませんが、全体についてのFYIは< =<のトピックBillで扱われたトピックThe Lizardのコメント:0から1までの任意の数をランダムに生成することが効果的に想定できるため(浮動小数点数のサイズの制限により技術的には問題はありませんが、実際には真である)連続する範囲内で特定の数値を得る確率は0であるため、num= .5またはnum< .5の違いはありません。IE:P(X = .5)= 0 Xは

+1

ああ、浮動小数点数が間違っています.5は正確に表現できる値です。したがって、<.5は<= .5より小さい1つの値を持つことになる。数学的には正解ですが、<=。5を使用する浮動小数点の場合は、シングルまたはダブルのどちらを使用するかによって、2^-24または2^-53のバイアスが導入されます。 – Joey

+0

.5は正確にすることができます私が述べたように、私はコンピュータが0と1の間で表すことができる値の数は無限であるという仮定のもとで働きました。その場合、離散的な数を得る確率は0です。私は、 IEEEの限界のために真実で、数字は約1^-36程度しか表現できませんが、数億回の試行をしなければ、それはかなり公平な仮定ですよね? –

7

おしっこXKCDへのオマージュ0と1の間のランダムな変数=:、あなたは「より良い」ランダムなデータを取得するためには/ dev /ランダムからのビットを読むことができるLinuxシステム上

string getHeadsOrTails { 
     return "heads"; //chosen by fair coin toss, 
         //guaranteed to be random 
    } 
2

をが、ほとんどランドMath.Random()のようなomメソッドは、深刻な暗号化作業が不足していると考えられるほぼすべてのアプリケーションにとってうまくいくでしょう。

+0

エントロピープールを使い果たすと、/ dev/randomがブロックされます。さらに、ランダムデータの汎用ソースとしてではなく、(暗号的に安全なPRNGを播種するための、または鍵を生成するための)疑わしいランダムデータの非常に低収量の供給源として意図されている。また、完全に偏りのないエントロピーを生成することが本当に難しく、おそらく不可能であるため、そこで50%の確率を保証することはできません。 – Joey

+0

ブロッキングが問題になるのはいつも/ dev/urandom ...ですが、Math.Random()よりも利点があるとは思いません。 – DrStalker

+0

それは暗号で安全です。しかし、暗号で何かをしたいのであれば、おそらくコインについて熟考しているわけではありません:) – Joey

0

この質問に対する唯一の真の答えは、確率を「保証」することができないことです。あなたがそれについて考えるなら、実際のコインフリップは50/50の確率で保証されません。コイン、それを反転させる人、コインが落とされて床を横切ってロールするかどうかによって決まります。 ;)

重要なのは、「十分にランダム」だということです。コインフリップをシミュレートしている場合は、投稿したコードは大丈夫です。

関連する問題