我对操作员有点困惑,并且随机生成使用。我想我只是问这个代码是否符合我的要求?
根据我分配函数的概率生成“随机”TRUE
或FALSE
。
bool randtf(int probability) {
if ((rand() % 100) < probability)
return true;
else
return false;
}
所以如果randtf(63)
有{63}的可能性为TRUE
?
非常感谢任何指导。感谢。
答案 0 :(得分:6)
是的,第一次近似。
不,更准确。 rand()
会在0
和RAND_MAX
之间返回一个数字,实际上该数字的格式始终为(1 << n) - 1
。这不是100的倍数,因此当您使用模数时,您将无法获得完美均匀的分布。
您可以使用拒绝抽样来解决这个问题。为了论证,我们假设RAND_MAX == 32767
(即16位)。第一步是继续生成随机数,拒绝它们直到你得到一个小于32700(100的最大倍数小于RAND_MAX
)。如果你那么做模数技巧,你就会得到统一的分布。
当然,这假设rand()
的实现是理智的,统计上强大的,这是一个很好的假设!
答案 1 :(得分:0)
MAX_RAND不是100的倍数,因此从技术上讲,您的分配不公平。你必须缩放rand(),而不是修改它。
答案 2 :(得分:0)
这取决于rand()
返回的内容,特别是如果可能的数字范围是100的精确倍数(并且均匀分布)。通常,使用modulo并不一定能为您提供正确的统计行为。
例如,假设您的rand()
仅返回值0,1,2,3,4,5,6;你说rand() % 5 < p
(0 <= p < 5
)。但是看到:这两次取值为0和1,但在有效源数范围内只取一次2,3和4!因此,对于p = 4
, 实际上不会有80%的概率,但只有1/7。
答案 3 :(得分: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 . . .