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

これは 2 回目の実行の n です。

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

より高い確率で失敗(0)としてすでに選択されている数をジェネレーターに選択させるにはどうすればよいですか?

これは、第 2 ラウンドの人物 2、3、および 4 が負ける確率が高いということです。これは、彼らが失敗しなければならないという意味ではありません。

エントリ 1 から 10 は、10 の異なるユーザー出力です。

わかりました、常にエントリの最大 30% が 0 になるとしましょう。上記が実行されるたびに。ただし、これはランダムに行われます。したがって、10 個のうち任意の 3 個の最大値がゼロになる可能性があります。

成功する確率を変えたくない。どれがゼロになるかを制御するためだけに。

さらに明確にするために私が望むもの: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 の場合、0 または 1 の確率は 50% です。n1 の対応する値 = 0 の場合、0 の確率は 60% です。

問題を明確にしていただきありがとうございます。もう一度やってみましょう!これには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 に答える