# How to generate a random data vector that follows a constraint

2 ビュー (過去 30 日間)
Saifullah Khalid 2019 年 9 月 29 日
コメント済み: Saifullah Khalid 2019 年 9 月 30 日
I want to generate random data vector where that follows this constrainst. where and is a constant. I would appreciate any help.

#### 0 件のコメント

サインイン to comment.

### 採用された回答

Bruno Luong 2019 年 9 月 29 日

This will generate uniform distribution (within to polytope)
N = 10;
Etotal = 0;
E = -log(rand(N+1,1));
E = E(1:N,:)./sum(E,1);

#### 2 件のコメント

Bruno Luong 2019 年 9 月 29 日
Here is a comparison of distribution with the two other methods proposed below to show the issue of non-uniformity if one doesn't pay attention
N = 2;
Etotal = 1;
p = 3e3;
Ebias = rand(1,p) .* randfixedsum(N,p,Etotal,0,Etotal);
E = rand(1,p).^(1/N)*Etotal .* randfixedsum(N,p,1,0,1);
E2 = -log(rand(N+1,p)); E2 = E2(1:N,:)./sum(E2,1);
subplot(2,2,1)
plot(Ebias(1,:),Ebias(2,:),'.');
title('rand * randfixedsum')
axis equal
subplot(2,2,2)
plot(E(1,:),E(2,:),'.');
axis equal
title('sqrt(rand) * randfixedsum')
subplot(2,2,3)
plot(E2(1,:),E2(2,:),'.');
axis equal
title('exponential method')
Saifullah Khalid 2019 年 9 月 30 日
Bruno Luong, thank very much for detailed answer and the insight.

サインイン to comment.

### その他の回答 (1 件)

Walter Roberson 2019 年 9 月 29 日
Look in the File Exchange for Roger's randfixedsum(). Generate a vector with fixed sum . Multiply all of the elements by rand() to implement the <= part. (Though you might want to worry about the difficulty that rand() is never exactly 1, so if you generate a sum exactly equal to and multiply by rand() then the result can never exactly total

#### 3 件のコメント

Bruno Luong 2019 年 9 月 29 日
IIUC you propose
E = rand()*Etotal * randfixedsum(N,1,1,0,1)
this will generate bad distribution (too many point close to 0 compare to uniform distribution), espetially for N >> 1.
Walter Roberson 2019 年 9 月 29 日
I was thinking of
rand() * randfixedsum(N,1,Etotal,0,Etotal)
but your comment might still apply.
Bruno Luong 2019 年 9 月 29 日
Both give the same non-uniform pdf
The "correct" one is
E = rand()^(1/N)*Etotal * randfixedsum(N,1,1,0,1);

サインイン to comment.

サインイン してこの質問に回答します。

R2019b

Translated by