2012-04-08 50 views
3

下面的代碼生成與成功的一個給定概率的隨機數:使用隨機發生器以概率用matlab

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

如果上述線被重複隨機(unpridictable)值將被生成:

這是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

如果您生成的矢量的一半爲一個,您已經有一個樣本的成功概率高於0.5(實際爲0.6)。請讓你的問題更清楚。 – 2012-04-08 13:48:39

+0

你的意思是人2,人4和人5的概率? – learnvst 2012-04-11 06:42:12

回答

1

下面是與以下邏輯的解決方案:

  1. 生成多達3次失敗,它們分配隨機
  2. 決定多少故障是在步驟2
  3. 給以前的失敗更高再次失敗的機率

請注意,我認爲它可能有0,1,2或3等於ilures。

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 
+0

@pac:你可以簡單地重複運行#2的步驟 – Jonas 2012-04-08 22:52:04

+0

對不起但你能更清楚@Jonas我將使它成爲一個函數,我應該從函數中排除哪部分?應該是輸出,以便在通話中使用它? – pac 2012-04-09 14:50:19

+0

@pac:我修改了代碼,以便每次運行都依賴於前一次運行。 – Jonas 2012-04-10 11:41:21

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。問題。讓我們再試一次! 我認爲你可以使用​​這個。這有點麻煩,因爲似乎沒有替代的加權抽樣選項。

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 
+0

你正在改變成功的可能性。我使用相同的代碼。只是生成它幾次。失敗的可能性總是 pac 2012-04-08 14:57:59

+0

指數用於未定義的時間@Richante – pac 2012-04-10 20:39:10

+0

謝謝,修復它。 – Richante 2012-04-10 20:47:44