0

假设我正在使用二进制向量 {0,1}。我只想将 p=[0,1] 之类的输入参数作为输入参数,并具有与给定概率相对应的确切数量的零(给定向量的长度,例如“N”),我应该将它们按随机顺序排列.

例如,对于 p=0.5 和 N=8,我想要类似 [0 0 1 0 1 1 0 1] 或 [1 1 0 0 1 0 0 1] 的东西,重要的是要有 50% 的零以随机顺序。如有必要,当无法表示时(即 p=0.200034 和 N=8),它应该四舍五入。

我做了 X = (rand(1,N)<=(1-p)); 但显然它并不总是给出确切的密度。另一种解决方案是为 cicle 做一个,并使用累加器以随机顺序访问向量,但我认为应该有一个更好(更快)的解决方案。

谢谢

4

2 回答 2

3

您可以计算个数,n; n用一和零构建一个向量N-n(按此顺序);然后随机排列该向量:

p = .5;
N = 8;

n = round(N*p); %// desired number of ones
result = [ ones(1,n) zeros(1,N-n) ]; %// n ones and N-n zeros
result = result(randperm(N)); %// random order
于 2014-04-07T16:47:23.383 回答
1

您可以使用从向量中对条目randsample进行勒索采样k = round( N * p )并将其设置为 1:

function v = myBinSample( p, N )
k = round( p * N );
idx = randsample( N, k );
v = zeros(1, N);
v( idx ) = 1;
于 2014-04-07T11:39:38.853 回答