在Matlab函数中更改随机数生成器

时间:2015-12-12 04:32:03

标签: matlab random

我有一个任务要完成,需要准随机数作为输入,但我注意到我想要使用的Matlab函数没有选择我想要使用的任何准生成器(例如Halton,Sobol等)。 Matlab将它们作为独立的功能而不是无处不在的“randn”和“rng”功能中的选项。 MatLab使用的是Mersenne Twister,一个伪生成器。因此,例如copularnd使用基于伪随机数的'randn'/'rng'....

有没有办法将它们合并到其他代码中嵌入的randrng函数中(例如copularnd)?任何指针都将非常感激。注意; 'copularnd'称'mvnrnd'反过来使用'randn'然后拉'rng'...

2 个答案:

答案 0 :(得分:2)

首先,您需要使用leapskipscramble属性初始化haltonset。 您可以查看文档,但简单描述如下:

  • 争夺 - 用于改组积分
  • 跳过 - 有助于从集合中排除一系列点数
  • Leap - 是从当前所选点到下一个点的跳转大小。中间的点被忽略。

现在您可以构建一个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)

link

&#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

一旦完成,我会发布我的解决方案:)