如何生成给定概率和约束的随机数?

时间:2014-07-12 11:03:28

标签: matlab

N.B:这不是我上一个问题的重复,因为我添加了约束!

我希望以给定的概率生成1到100之间随机数的矩阵A(40x10000):

p1=Prob(1)     (chance of 1)
p2=Prob(2)     (chance of 2)
 ... 
p100=Prob(100)  (chance of 100)

和约束:V1,V2,...,V20是包含1到100之间的4个元素的向量。矩阵A的每个列向量应该包含这20个向量中的每一个的至少一个元素。 V1, ..., V20是具有已知元素的预定义向量。

例如,如何修改以下程序以添加最后一个约束:

h = 40; w = 10000;
A = reshape( randsample( numel(Prob), h*w, true, Prob ), [h w] );

更多详情:

  • 每个A(:,i) {i=1,..,10000}应包含所有Vk(1) or Vk(2) or Vk(3) or Vk(4)的{​​{1}}。 k=1,..,20必须包含每个A(:,i)中至少一个值,但它会尊重概率并且不会生成重复值。如果VkVi的某些值相等,则Vj可以使用单个元素验证A(:,k)Vi约束。

  • 例如:如果VjV1=[6 87 1 56]应包含6或87或1或56但A(:,i)可能包含(6和1)或(6和1和87) )或......

1 个答案:

答案 0 :(得分:1)

这是一个解决方案:

h=40;
w=10000;
output=zeros(h,w);
i=1;
while i<=w
temp=randsample(numel(prob),h,true,prob);
check=all(any(ismember(vec,temp)));
if check~=0
output(:,i)=temp;
i=i+1;
end
end

不幸的是,这需要大约4分钟来生成具有指定约束的矩阵。欢迎任何其他花费更少时间的解决方案。