2017-03-31 62 views
0

我看到下面的問題一個一個站點:生成0和1,用25%和75概率

how to generate 0 and 1 with 25% and 75% probability, here is corresponding code in c++ 

int rand50() 
{ 
    // rand() function will generate odd or even 
    // number with equal probability. If rand() 
    // generates odd number, the function will 
    // return 1 else it will return 0. 
    return rand() & 1; 
} 
bool rand75() 
{ 
    return rand50() | rand50(); 
} 

但不幸的是我不能這樣做

>> bitand(rand,1) 
Error using bitand 
Double inputs must have integer values in the range of ASSUMEDTYPE. 

因此我用以下算法 1. rand50

function boolean=rand50() 

     probability=rand; 

     if probability <=0.5 
      boolean=0; 
     else 
      boolean=1; 
     end 

     end 

2.rand75

function boolean=rand75() 
boolean=bitor(rand50(),rand50()); 

end 

我認爲它們是等價的正確?或至少很好地近似在C/C而在MATLAB它返回01之間的double ++返回一個整數

回答

2

rand。正如你所展示的,你可以構造一個功能,這將給你的truefalse使用0.5概率相等的值,但它可以縮短爲:

function bool = rand50() 
    bool = rand() < 0.5; 
end 

話雖這麼說,我想我會建議修改你的函數有點接受一個維度作爲輸入,這樣你就可以一次生成任意數量的隨機樣本。然後,您可以測試輸出,以確保它是按預期

function bool = rand50(sz) 
    bool = rand(sz) < 0.5; 
end 

function bool = rand75(sz) 
    bool = rand50(sz) | rand50(sz); 
end 

現在我們可以測試這個

samples = rand75([10000, 1]); 
mean(samples) 
% 0.7460 

現在,如果你忽略你所示的代碼,更好的方式來產生隨機與給定頻率的數字將是創建一個功能,您可以指定0或1的想要的百分比,並用它來比較的rand

function bool = myrand(sz, percentage) 
    bool = rand(sz) < percentage; 
end 

% Get 10 samples with 25% 1's 
values = myrand([10, 1], 0.25); 
+2

輸出的FUNC改變「50」輸入變量的名稱將允許你產生以任意頻率分配的0/1,例如, 25%/ 75% – Jonas

+0

非常感謝主席先生\ –

+0

@JOnas我的朋友怎麼樣?我沒有得到點 –