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)
中至少一个值,但它会尊重概率并且不会生成重复值。如果Vk
和Vi
的某些值相等,则Vj
可以使用单个元素验证A(:,k)
和Vi
约束。
例如:如果Vj
,V1=[6 87 1 56]
应包含6或87或1或56但A(:,i)
可能包含(6和1)或(6和1和87) )或......
答案 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分钟来生成具有指定约束的矩阵。欢迎任何其他花费更少时间的解决方案。