圣彼得堡现象。概率论的悖论。 - 页 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:

为什么它是歪的?这不是歪门邪道,只是编译器在说脏话,但这是徒劳的脏话。

你可以做以下事情来避免它。

要检查它并不难。

我们做到了,这个随机性根本不是随机的。那是很久以前的事了,早在第四届论坛上。我不记得他们具体是如何检查的,但画面是相当正弦的。这并不是因为编译器会责骂我们。

 
Dmitry Fedoseev:

我们检查了一下,这个随机性根本不是随机的。

你在说什么!?

MathRand()%2 只取两个值--0或1。

 
Dmitry Fedoseev:

我们检查了一下,这个随机性根本不是随机的。那是很久以前的事了,早在第四届论坛上。我不记得具体是如何检查的,但画面是相当正弦的。这并不是说编译器在骂人,而是根本没有。

是的,我明白你的意思。的确,我看到了一个随机过程中的辍学。rand()算法显然远非完美。
是的,那么这个变体,尤其是它是最快的,因为没有数学运算。

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

你在说什么!?

MathRand()%2只取两个值--0或1。

但你可以把它们加起来,或者不从两个人身上取余下的部分。

 
是的,最正常的选项是if(rand()<16384),我没有想到这一点))
 
Dmitry Fedoseev:
是的,最正常的变体是if(rand()<16384),有些东西没有想到)

你可以再做一些曲折。

if(rand()<1<<14) 

这是完全相同的,但以一种大多数人不理解的方式。))

 
但如果是0到5,或7,或任何其他数字呢?你仍然要除以32768.0。或者有什么选择吗?