3

以下代码生成具有给定成功概率的随机数:

         n=[randi([0 1],1,8) ones(1,8)];
         n= n(randperm(10));

如果上述行重复,将生成随机(不可预测的)值:

这是第一次运行的 n:

 n =     1     0     1     0     0     1     1     1     1     1

这是第二次运行的 n:

 n =     1     1     1     0     1     1     1     1     1     1

如何使生成器以更高的概率选择已选为失败(0)的数量?

也就是第二轮的人2、3、4输的概率更大。这并不意味着他们必须失败。

条目 1 到 10 是 10 个不同的用户输出。

好的,让我们说始终最多 30% 的条目将为 0。在每次执行上述操作时。然而,这是随机完成的。因此,10 个中的任何 3 个的最大值都可以为零。

我不想改变成功的概率。只是控制哪一个为零。

为了进一步澄清我想要什么:如果将“随机”选择 3 为零,那么让先前选择的三个有更高的概率被选中而不被选中。

4

2 回答 2

1

这是具有以下逻辑的解决方案:

  1. 最多生成 3 个故障,随机分配它们
  2. 确定步骤 2 中有多少失败
  3. 让之前的失败有更高的机会再次失败

请注意,我假设它同样可能有 0、1、2 或 3 次失败。

nRuns = 5;
allRuns = zeros(nRuns,10); %# stores success and failure for all runs

%# (1) generate from 0 to 3 failures (each outcome is equally likely)
nFailures = randi([0 3],1);
tmp = randperm(10);

firstRun = tmp > nFailures
allRuns(1,:) = firstRun;

%# (2) decide how many failures occur in the 2nd run (each outcome is equally likely)
for iRun = 2:nRuns
%# as the loop has been added later
%# I use "2" to indicate any next run
nFailures2 = randi([0 3],1);

%# (3) give previous failures a higher chance to fail again
failIdx = find(~allRuns(iRun-1,:));
successIdx = find(allRuns(iRun-1,:));
%# 5x higher chance of failing for previous failures
failCandidates = [repmat(failIdx,1,5),successIdx];

failCandidatesRand = failCandidates(randperm(length(failCandidates)));

%# if you have R2012a or later
failCandidatesRand = unique(failCandidatesRand ,'stable');
toFail = failCandidatesRand (1:nFailures2);

%# alternatively, if you have R2011b or earlier
toFail = zeros(nFailures2,1);
toFail(1) = failCandidatesRand(1);
ii = 2;
kk = 2;
while ii < (nFailures2+1)
if ~any(toFail==failCandidatesRand(kk));
toFail(ii) = failCandidatesRand(kk);
ii = ii + 1;
end
kk = kk + 1;
end

%# write failures
nextRun= true(1,10);
nextRun(toFail) = false

allRuns(iRun,:) = nextRun;
end
于 2012-04-08T21:57:06.547 回答
0

也许你想要这样的东西:

n1 = rand(1, 8) > 0.5;
n2 = rand(1, 8) > (n1 * 0.5 + ~n1 * 0.6);

这将以相等的概率生成第一组 0 和 1。对于n2,如果n1中对应的值为1,那么有50%的概率是0或者1。如果n1中的对应值=0,那么有60%的概率是0。

感谢您澄清问题。让我们再试一次!我认为您可以为此使用randsample。这有点混乱,因为似乎没有不替换的加权采样选项。

N = ones(1, 10);
for round=1:10
  failures = randi([1, 3]);
  indices = [];
  while (numel(unique(indices)) < failures)
    indices = randsample(10, failures, true, [N + ~N*1.1]);
  end
  N = ones(1, 10);
  N(indices) = 0;
  disp(N);
end
于 2012-04-08T14:27:14.953 回答