我有一个任务要完成,需要准随机数作为输入,但我注意到我想要使用的Matlab函数没有选择我想要使用的任何准生成器(例如Halton,Sobol等)。 Matlab将它们作为独立的功能而不是无处不在的“randn”和“rng”功能中的选项。 MatLab使用的是Mersenne Twister,一个伪生成器。因此,例如copularnd使用基于伪随机数的'randn'/'rng'....
有没有办法将它们合并到其他代码中嵌入的rand
或rng
函数中(例如copularnd
)?任何指针都将非常感激。注意; 'copularnd'称'mvnrnd'反过来使用'randn'然后拉'rng'...
答案 0 :(得分:2)
首先,您需要使用leap,skip和scramble属性初始化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
答案 1 :(得分:0)
&#39; qrandstream&#39;可能是我正在寻找的答案......用&#39; qrand&#39;而不是&#39; rand&#39;
例如来自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
一旦完成,我会发布我的解决方案:)