2014-04-07 2 views
0

이진 벡터 {0,1}을 사용한다고 가정합니다. 그냥 p = [0,1]과 같은 입력 인자를 넣고 주어진 확률 (벡터의 길이가 주어지면 'N')에 해당하는 0의 정확한 수를 갖기를 원합니다. 나는 그것들을 무작위로 가져야합니다. 주문.확률 밀도가 지정된 이진 벡터

예를 들어, p = 0.5 및 N = 8 인 경우 [0 0 1 0 1 1 0 1] 또는 [1 1 0 0 1 0 0 1]과 같은 값을 가지므로 중요한 점은 무작위 순서로 0의 50 %. 필요한 경우 표현이 가능하지 않을 때 반올림해야합니다 (예 : p = 0.200034 및 N = 8).

나는 X = (rand (1, N) < = (1-p)); 하지만 분명히 정확한 밀도를주지는 않습니다. 또 다른 해결책은 cicle을 사용하고 누적 기 (accumulator)를 사용하여 임의의 순서로 벡터를 방문하는 것이지만 더 나은 (더 빠른) 솔루션이되어야한다고 생각합니다.

감사

답변

3

당신은 사람의 수, n을 계산할 수 있습니다; bulyd 벡터는 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 
+1

두 가지 모두 좋은 해결책이지만, 나는 구현 한 것이므로 이것을 선택한다. 고맙습니다! –

1

당신은 1로 벡터에서 샘플을 k = round(N * p) 항목을 ransomly 및 설정 randsample를 사용할 수 있습니다

function v = myBinSample(p, N) 
k = round(p * N); 
idx = randsample(N, k); 
v = zeros(1, N); 
v(idx) = 1;