【问题标题】:Using random generator with probability using matlab使用matlab使用概率随机生成器
【发布时间】:2012-04-08 13:44:07
【问题描述】:

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

         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 为零,那么让之前选择的三个有更高的概率被选中而不被选中。

【问题讨论】:

  • 如果你生成一半的向量作为向量,你已经有一个成功概率高于 0.5(实际上是 0.6)的样本。请让您的问题更清楚。
  • 你是指2、4、5个人的概率吗?

标签: matlab probability


【解决方案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

【讨论】:

  • @pac:您可以简单地重复运行 #2 的步骤
  • 抱歉,你能说清楚点吗@Jonas 我要把它变成一个函数,我应该从函数中排除哪一部分?应该是输出,以便在调用中使用它?跨度>
  • @pac:我已经修改了代码,所以每次运行都依赖于前一次。
  • @pac:以下运行的代码唯一需要上一次运行的信息的地方是访问“allRuns”的位置。因此,您应该可以直接复制循环体并将其添加到“其他几个函数”之后 - 您需要替换的只是计算 failIdx 和 successIdx 的行。
  • 我们可以做 nRuns=2 @Jonas 让它 1 RUN 吗?是的,你的意思是,但我不希望它在主体中使用它。这就是为什么我更喜欢全部成为 1 个大功能
【解决方案2】:

也许你想要这样的东西:

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

【讨论】:

  • 你正在改变成功的概率。我使用的是相同的代码。只是生成了几次。失败的概率总是
  • indices 用于未定义 @Richante 的 while
  • 总是给一个 10*10 @Richante
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 2013-12-06
  • 2014-10-06
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多