return 'Heads' if Math.random() < 0.5
はこれを行うには良い方法はありますか?
おかげ
編集:戻り値を無視し、「より良い」とは、正確な50-50確率を意味してください。
return 'Heads' if Math.random() < 0.5
はこれを行うには良い方法はありますか?
おかげ
編集:戻り値を無視し、「より良い」とは、正確な50-50確率を意味してください。
は、私は本当にあなたが使用している言語を知らないが、乱数が2で割り切れるであれば、それはそれは尾で、その後でない場合、それは頭で
return 'Heads' if Math.random() * 100 mod 2 = 0
を試してみてください。
これは実際には動作しないかもしれません。いくつかのRNGの左端ビットは右端ビットよりランダムである。 –
このような手法を使用する場合、random()が上位ビットと同じように下位ビットでランダムであることを確認してください。 rand(3)のノートを参照してください。linux.die.net/man/3/rand – Stephan202
これは、98が52と同じくらい有効で、02と同じように有効であるため、mod 2を使用した理由です。あなたがモード2を使用する場合は、偶数と奇数の間でかなり均等にブレークする必要があります。 –
いつも死んだシンプルがあります。
コイン= rand(1);
多くのスクリプト言語では、これは0とargの間のランダムなintを与えるので、1を渡すと0または1(頭や尾)が得られます。
この可処分性が50%であるか? – unj2
私はそれを保証することはできないと思います。 – ChristianLinnell
Tal Pressmanは「正確な50-50チャンス」を得ることができると言いました。それは間違っていますか? – unj2
奇数と偶数を区別してみてください。また、文字列ではなく、列挙値(またはブール値)を返します。
あなたが持っているものは私がやる方法です。 0.0 < = Math.random()< 1.0と同じように、(Math.random()< 0.5)は、Math.random()が0.0と0.4999の間にあるときに頭を出します。それは0.5と0.999の間です...それはあなたが得ることができる公正なコインフリップです。
もちろん、私はMath.random()の良い実装を前提としています。
Numerical Recipes in Cは、組み込みの乱数ジェネレータを信頼できないと言っています。おそらく、本の中に示されているアルゴリズムを関数ran1()として実装することができます。このアルゴリズムは、1992年のランダム性に関する既知の統計テストのすべてを、約1コール未満で渡します。
ran1()アルゴリズムの背後にある基本的な考え方は、乱数ジェネレータの出力にシャッフルを追加して、低次のシリアル相関を減らすことです。彼らはコンピュータ・プログラミング第2巻の芸術のセクション3.2-3.3からのベイ・ダーラム・シャッフルを使用しますが、私はFisher-Yates shuffleも使用できると思います。
あなたがより多くのランダムな値が必要な場合は、同じ文書は、(私の推測では、2.3×10 の期間に基づいて)少なくとも10 値のために良いことがありますジェネレータ(RAN2)を提供します。線形合同ジェネレータがあなたに何らかの問題を与えるなら、乱数を生成するために別の方法を使用する関数(ran3)も提供します。
< 0.5テストでは、これらの機能のいずれかを使用して、均一な分布が得られると確信できます。
Numerical Recipesライセンス(書籍に含まれ、nrbook.comウェブサイトに掲載されている)は、ソースコードの再配布を特に禁止しているので、ran1コードは数値レシピではないことを願っています。 nr.com/licenses/redistribute.html – las3rjock
善良な主人、私は以前にそれを見たことがありません。オープンソースプロジェクトではコードの完全な本は使用できません...うわー。 – fenomas
はい、本当にありがとうございます。私は翻訳を削除しました。乱雑な乱数生成が必要な場合は、自分の本のコピーを購入し、翻訳を自分で行う必要があります。 – garethm
私は評判がないので人の投稿にコメントすることはできませんが、全体についてのFYIは< =<のトピックBillで扱われたトピックThe Lizardのコメント:0から1までの任意の数をランダムに生成することが効果的に想定できるため(浮動小数点数のサイズの制限により技術的には問題はありませんが、実際には真である)連続する範囲内で特定の数値を得る確率は0であるため、num= .5またはnum< .5の違いはありません。IE:P(X = .5)= 0 Xは
ああ、浮動小数点数が間違っています.5は正確に表現できる値です。したがって、<.5は<= .5より小さい1つの値を持つことになる。数学的には正解ですが、<=。5を使用する浮動小数点の場合は、シングルまたはダブルのどちらを使用するかによって、2^-24または2^-53のバイアスが導入されます。 – Joey
.5は正確にすることができます私が述べたように、私はコンピュータが0と1の間で表すことができる値の数は無限であるという仮定のもとで働きました。その場合、離散的な数を得る確率は0です。私は、 IEEEの限界のために真実で、数字は約1^-36程度しか表現できませんが、数億回の試行をしなければ、それはかなり公平な仮定ですよね? –
おしっこXKCDへのオマージュ0と1の間のランダムな変数=:、あなたは「より良い」ランダムなデータを取得するためには/ dev /ランダムからのビットを読むことができるLinuxシステム上
string getHeadsOrTails {
return "heads"; //chosen by fair coin toss,
//guaranteed to be random
}
をが、ほとんどランドMath.Random()のようなomメソッドは、深刻な暗号化作業が不足していると考えられるほぼすべてのアプリケーションにとってうまくいくでしょう。
エントロピープールを使い果たすと、/ dev/randomがブロックされます。さらに、ランダムデータの汎用ソースとしてではなく、(暗号的に安全なPRNGを播種するための、または鍵を生成するための)疑わしいランダムデータの非常に低収量の供給源として意図されている。また、完全に偏りのないエントロピーを生成することが本当に難しく、おそらく不可能であるため、そこで50%の確率を保証することはできません。 – Joey
ブロッキングが問題になるのはいつも/ dev/urandom ...ですが、Math.Random()よりも利点があるとは思いません。 – DrStalker
それは暗号で安全です。しかし、暗号で何かをしたいのであれば、おそらくコインについて熟考しているわけではありません:) – Joey
この質問に対する唯一の真の答えは、確率を「保証」することができないことです。あなたがそれについて考えるなら、実際のコインフリップは50/50の確率で保証されません。コイン、それを反転させる人、コインが落とされて床を横切ってロールするかどうかによって決まります。 ;)
重要なのは、「十分にランダム」だということです。コインフリップをシミュレートしている場合は、投稿したコードは大丈夫です。
どのような言語ですか?なぜ文字列を返すのですか? –
どのように「より良い」? random()が0 <= num <1の浮動小数点数を生成すると仮定すると、正確な確率は50-50です。 –
「エッジコイン」はどうですか? ;) – DisgruntledGoat