2015-12-12 40 views
2

我有一個任務需要完成,需要準隨機數作爲輸入,但我注意到我想使用的Matlab函數沒有選項來選擇任何準發生器I想要使用(如Halton,Sobol等)。 Matlab將它們作爲獨立功能,而不是作爲無處不在的'randn'和'rng'功能中的選項。 MatLab使用的是Mersenne Twister,一種僞發生器。因此,例如在copularnd使用「randn」 /「RNG」,這是基於僞隨機數....在Matlab函數中更改隨機數發生器

有沒有將其納入嵌入到其他代碼(例如copularnd)的randrng功能的方法嗎?任何指針將不勝感激。注意; 「copularnd」所謂的「mvnrnd」又使用「randn」然後再換「RNG」 ......

+0

作爲第一步,檢查出的文檔上['rng'](http://se.mathworks.com/幫助/ MATLAB/REF/rng.html)。 – mikkola

+0

這是在「可怕的黑客,可能會導致未來可能遇到的問題」類別,但如果copularnd調用mvnrnd,我認爲您可以在本地目錄中創建自己的mvnrnd函數,並且如果您從該目錄執行copularnd, mvnrnd函數將被調用(而不是Matlab內置函數)... –

+0

是的@MatthewGunn。我正在思考這些問題。注意... qrandstream和qrand/rand組合可以解決問題而不會導致其他問題。我將在今天進行測試(一旦完成了其他工作,我必須完成)。看到我以前的評論。 –

回答

2

首先,你需要使用leapskipscramble屬性初始化haltonset。 您可以查看文檔,但容易說明如下:

  • 爭奪 - 用於洗牌點
  • 跳過 - 有助於從集合排除點的範圍
  • 閏秒 - 是從當前選定點跳到下一個點的大小。中間的點被忽略。

現在你可以建立一個haltonset對象:

p = haltonset(2,'Skip',1e2,'Leap',1e1); 
p = scramble(p,'RR2'); 

這使得通過跳過第100號和跳躍超過10個號碼設置2D哈爾頓數。爭奪方法是在第二行應用的'PR2'。你可以看到,會產生許多問題:

p = 

Halton point set in 2 dimensions (818836295885536 points) 

Properties: 
       Skip : 100 
       Leap : 10 
    ScrambleMethod : RR2 

當你有你的haltonset對象,對,你可以通過只選擇他們訪問值:

x = p(1:10,:) 

聲明:所以 ,你需要先創建對象然後使用生成的點。要獲得不同的結果,您可以使用函數的Leap和Scramble屬性。你可以做的另一件事是使用統一的分佈,如randi每次從生成的點中選擇數字。這確保您每次訪問數據集的統一隨機部分。例如,您可以生成隨機索引向量(本例中爲4點)。然後使用這些來從halton點中選擇點。

>> idx = randi(size(p,1),1,4) 

idx = 

    1.0e+14 * 

    3.1243 6.2683 6.5114 1.5302 

>> p(idx,:) 

ans = 

    0.5723 0.2129 
    0.8918 0.6338 
    0.9650 0.1549 
    0.8020 0.3532 
+0

感謝您的投入人員,但我認爲我的問題沒有得到充分解答。更具體地說,我試圖在MatLab中使用copularnd函數。然而,它在其代碼中使用rng/randn(僞rng,Mersenne Twister)來計算copula分佈函數。我不想這樣做,我想使用準隨機數(Halton,Sobol等)。該文件沒有明確表明這是可能的,因此我的問題。我可以生成Halton序列......但是,如何獲得「rand」以在copularnd中使用它? @mikkola –

+0

然後,您需要通過編輯您的問題來解釋更多,並考慮添加一些代碼,或者您可以提出另一個問題。 – NKN

+0

更新:似乎我可能不得不重新編碼copularnd函數...找到一種方法來使用Halton #s。例如,我可能不得不在任何我在copularnd代碼中找到的地方用「p」代替「rand」......我希望得到一個更加優雅和高效的解決方案,並且編碼錯誤的可能性很小。 –

0

link

'qrandstream' 可能是我要找的答案....用,而不是 '蘭特'

e.g 'qrand' ..從MATLAB DOC

p = haltonset(1,'Skip',1e3,'Leap',1e2); 
p = scramble(p,'RR2'); 
q = qrandstream(p); 

nTests = 1e5; 
sampSize = 50; 
PVALS = zeros(nTests,1); 
for test = 1:nTests 
    X = qrand(q,sampSize); 
    [h,pval] = kstest(X,[X,X]); 
    PVALS(test) = pval; 
end 

我會後我的解決方案,一旦我做了:)