1

今、私は持っています

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

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

ありがとう

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

4

9 に答える 9

10

死んだシンプルさは常にあります

コイン=ランド(1);

多くのスクリプト言語では、これにより 0 と引数の間のランダムな int が得られるため、1 を渡すと 0 または 1 (表または裏) が得られます。

于 2009-05-19T01:52:55.057 に答える
7

xkcd へのささやかなオマージュ:

string getHeadsOrTails {
        return "heads"; //chosen by fair coin toss,
                        //guaranteed to be random
    }
于 2009-05-19T04:48:13.007 に答える
7

Numerical Recipes in Cは、重要な場合に組み込みの乱数ジェネレーターを信頼しないように言っています。この本に示されているアルゴリズムを関数 ran1() として実装することもできます。これは、約 10 8 回未満の呼び出しで、既知のすべてのランダム性の統計テスト (1992 年) に合格すると主張しています。

ran1() アルゴリズムの背後にある基本的な考え方は、乱数ジェネレーターの出力にシャッフルを追加して、低次のシリアル相関を減らすことです。彼らは The Art of Computer Programming Volume 2 のセクション 3.2-3.3 の Bays-Durham シャッフルを使用していますが、 Fisher-Yates シャッフルも使用できると思います。

それ以上のランダム値が必要な場合は、同じドキュメントでジェネレーター (ran2) も提供されています。これは、少なくとも 10 17の値に適しているはずです (2.3 x 10 18の周期に基づく私の推測)。また、線形合同ジェネレーターで何らかの問題が発生した場合に備えて、別の方法を使用して乱数を生成する関数 (ran3) も提供します。

これらの関数のいずれかを < 0.5 検定で使用して、一様分布を得ていることをより確実にすることができます。

于 2009-05-19T03:52:25.103 に答える
4

あなたが持っているものは、私がする方法です。標準のように、0.0 <= Math.random() < 1.0 の場合、(Math.random() < 0.5) は、Math.random() が 0.0 と 0.4999 の間の場合に表が出ます...それは 0.5 から 0.999 の間です...これはコイントスと同じくらい公平です。

もちろん、私は Math.random() の適切な実装を想定しています。

于 2009-05-19T02:14:45.963 に答える
2

Linuxシステムでは、/ dev / randomからビットを読み込んで「より良い」ランダムデータを取得できますが、Math.Random()のようなほぼランダムなメソッドは、深刻な問題を除いて、考えられるほとんどすべてのアプリケーションで問題ありません。暗号化作業。

于 2009-05-19T05:07:16.090 に答える
0

私は評判がないので、人々の投稿にコメントすることはできませんが、Bill The Lizard のコメントで取り上げられている <= vs. < トピック全体についての参考までに: ランダムが間の任意の数を生成していると効果的に想定できるため0-1 (浮動小数点数のサイズの制限により技術的にはそうではありませんが、実際には多かれ少なかれ真実です) num <= .5 または num < .5 に違いはありません任意の連続範囲で特定の数値を取得する確率は 0 であるため、IE: X = 0 と 1 の間のランダム変数の場合、P(X=.5) = 0

于 2009-05-19T04:09:19.980 に答える
0

この質問に対する唯一の本当の答えは、確率を「保証」できないということです。考えてみれば、実際のコイントスは 50/50 の確率で保証されているわけではありません。それは、コイン、それを弾く人、およびコインが落ちて床を横切って転がるかどうかに依存します。;)

ポイントは、「十分にランダム」であるということです。コイントスをシミュレートしている場合、投稿したコードは問題ありません。

于 2009-05-19T23:28:36.530 に答える
0

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

于 2009-05-19T01:54:48.627 に答える
-4

試す

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

どの言語を使用しているかはわかりませんが、乱数が 2 で割り切れる場合は表で、そうでない場合は裏です。

于 2009-05-19T01:47:56.767 に答える