サンクトペテルブルク現象。確率論のパラドックス。 - ページ 3

 
Dmitry Fedoseev:

4のベットでは、(ゲームのルールを正しく理解していれば)同じ土俵に立つことができるようです。

if(MathRand()/32768.0<0.5)  ...
if(MathRand()%2==0) ...

または

if(MathRand()%2) ...

または

if(MathRand()<16384) ...
 
Nikolai Semko:

または

または

最後の選択肢です。カーブの分割の残り-を確認した。

 
Dmitry Fedoseev:

最後の選択肢です。カーブの分割の残り-を確認した。

なぜ曲がっているのか?曲がっているのではなく、コンパイラが悪態をついているだけなのですが、無駄な悪態をついてしまうのです。

それを避けるには、こうすればいい。

if(bool(MathRand()%2))  ...

確認するのは難しいことではありません。

int OnStart()
  {
   for (int i=0; i<10; i++) if(bool(MathRand()%2)) Print(i);
  }  
 
Nikolai Semko:

なぜ曲がっているのか?曲がっているのではなく、コンパイラが悪態をついているだけなのですが、無駄な悪態をついているのです。

それを避けるために、次のようなことをしてもよいでしょう。

確認するのは難しいことではありません。

やりましたよ!ランダム性は全くありませんでした。もうずいぶん前のことですが、第4回フォーラムの頃です。どのように確認したかはよく覚えていませんが、かなり正弦波的な絵になっていました。コンパイラに叱られるからというわけではありません。

 
Dmitry Fedoseev:

確認したところ、ランダム性は全くありませんでした。

何を言っているんだ!?

MathRand()%2は、0か1の2つの値しか取らない。

 
Dmitry Fedoseev:

確認したところ、ランダム性は全くありませんでした。昔、第4回フォーラムのころの話です。どのように確認したかはよく覚えていませんが、かなり正弦波的な絵になっていました。コンパイラが叱っているわけでは全然ないんです。

はい、ご指摘の通りです。確かに、ランダムプロセスからの脱落が見られました。rand()アルゴリズムが完璧でないことは明らかです。
はい、ではこのバリエーションは、特に数学的な操作がないため、最も高速です。

if(rand()<16384) ...
 
Nikolai Semko:

何を言っているんだ!?

MathRand()%2は、0か1の2つの値しか取りません。

でも、2つから余りを取らずに合計してもいいんですよ。

 
そうですね、if(rand()<16384)で一番普通の選択肢ですね、思いつきませんでした))
 
Dmitry Fedoseev:
はい、if(rand()<16384)で最も正常なバリアントは、何か考えませんでした))

もうちょっとひねりを加えてもいいんじゃないですか?

if(rand()<1<<14) 

というのは、全く同じですが、ほとんどの人が理解できない方法です。))

 
でも、0から5とか7とか、他の数字ならどうでしょう?やはり32768.0で割る必要があります。それともオプションがあるのでしょうか?