2017-03-31 64 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我的朋友怎么样?我没有得到点 –