2011-10-26 60 views
2

我对运营商有些困惑,并且在随机生成中使用。我想我只是问这个代码做我想做的事情?基于概率的真或假

根据我分配函数的概率生成一个'随机'TRUEFALSE

bool randtf(int probability) { 
    if ((rand() % 100) < probability) 
     return true; 
    else 
     return false; 
} 

所以如果randtf(63)所以它具有TRUE 63%的机会呢?

任何指导将不胜感激。谢谢。

+0

哪里兰特()是从哪里来的?它是否返回0到1之间的随机数(独占)? – dgrant

+0

@dgrant,如果它返回一个浮点数,'%100'会给你一个编译器错误。 – mikerobi

+0

目前没有,它只是标准的低级兰特(),我用这个问题。 – Elgoog

回答

5

是的,第一个近似值。

不,更准确。 rand()返回一个介于0RAND_MAX之间的数字,实际上它的格式总是(1 << n) - 1。这不是100的倍数,所以当你使用模数时,你不会得到完全一致的分布。

您可以通过使用拒绝采样来解决这个问题。为了论证,我们假设RAND_MAX == 32767(即16位)。第一步是继续生成随机数,拒绝它们,直到获得小于32700的数字(100的最大倍数小于RAND_MAX)。如果你然后做模数技巧,你会得到一个统一的分布。

当然,这假设一个健全的,统计学上强大的rand()实现,这是一个相当的假设!

+0

Downvoter:关心评论? –

+0

任何关于如何获得统一发行版的线索? – Elgoog

+0

如果RAND_MAX是32767底部的0-27将比28-99略多3.125% –

0

MAX_RAND不是100的倍数,所以你的分布在技术上不公平。你必须调整rand(),而不是mod。

+0

-1:由于类似的原因,这也不起作用。 –

+0

为什么因为rand()首先不是很随机? – MartyTPS

+1

@OliCharlesworth,按照规模我假设他的意思是'(float)rand()/ RAND_MAX mikerobi

0

它取决于什么rand()返回,特别是如果可能的数字的范围是100的精确倍数(并且均匀分布)。一般来说,使用模数不一定会给你正确的统计行为。例如,你的rand()只返回了值为0,1,2,3,4,5,6;你说rand() % 5 < p(其中0 <= p < 5)。但是,请注意:这将取值0和1两次,但是2,3和4只会在有效源数字范围内出现一次!所以用p = 4不要实际得到80%的概率,但只有1/7。

+0

我认为其实际上是6/7。 –

0

即使随机发生器是完全随机的,因为rand()只生成0到0x7FFF之间的数字,所以它不能完美分布。考虑下面的代码:

int arr[100] = { 0 }; 
for(int i=0; i<0x7FFF; i++){ 
arr[ i % 100 ]++; 
} 

for(int i=0; i<100; i++){ 
    cout << arr[i] << endl; 
} 
return 0; 

如果你运行这段代码,它不会给你相同数量:

328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
328 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
327 
Press any key to continue . . . 
+0

'rand()'不会生成数字“从0到0x7fff”,而是“从0到RAND_MAX”,在许多通用平台上的数据大于0x7fff。不过,我同意其余的。 –

+0

哇,这是我的itty bitty手机上的一个长帖子:P –