簡體   English   中英

基於概率的對錯

[英]true or false based on probability

我對運算符有些困惑,並在其中使用了隨機數生成。 我想我只是問這個代碼是否可以實現我想要的功能?

根據我為函數分配的概率,生成“隨機”的TRUEFALSE

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

所以如果randtf(63)它有63%的可能性為TRUE

任何指導將不勝感激。 謝謝。

是的,一個近似值。

不,更准確地說。 rand()返回介於0RAND_MAX之間的數字,實際上,該數字將始終為(1 << n) - 1 這不是100的倍數,因此在取模時您不會得到完全均勻的分布。

您可以使用拒絕采樣來解決此問題。 為了論證,我們假設RAND_MAX == 32767 (即16位)。 第一步是繼續生成隨機數,拒絕它們,直到獲得小於32700的隨機數(100的最大倍數小於RAND_MAX )。 如果您隨后對此進行模數欺騙,則將獲得均勻分布。

當然,這假設rand()具有合理的,統計上可靠的實現,這完全是一個假設!

MAX_RAND不是100的倍數,因此從技術上講您的分配不公平。 您必須縮放rand()而不是對其進行修改。

這取決於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。

即使隨機生成器是完全隨機的,由於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 . . .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM