Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的光谱测试_R_Random_Plot_Spectral - Fatal编程技术网

R中的光谱测试

R中的光谱测试,r,random,plot,spectral,R,Random,Plot,Spectral,我希望更改代码,使10000点放置在[0,1]^2绘图中。我尝试将256更改为10000,但它会生成奇怪的位置。我应该改变因子137和187,但不确定如何改变它。有人知道背后的逻辑吗 工作样本: nSim = 256 X=rep(0,nSim) for (i in 2:nSim){ X[i] = (137*X[i-1]+187)%%256 } plot(X[-1],X[-nSim],col="blue",type="p",pch="x",lwd=2) 我的代码: nSim = 10

我希望更改代码,使10000点放置在[0,1]^2绘图中。我尝试将256更改为10000,但它会生成奇怪的位置。我应该改变因子137和187,但不确定如何改变它。有人知道背后的逻辑吗

工作样本:

nSim = 256
X=rep(0,nSim)
for (i in 2:nSim){
    X[i] = (137*X[i-1]+187)%%256 
}
plot(X[-1],X[-nSim],col="blue",type="p",pch="x",lwd=2)

我的代码:

nSim = 10000
X=rep(0,nSim)
for (i in 2:nSim){
  X[i] = ((137*X[i-1]+187)%%nSim)
}
plot(X[-1]/nSim,X[-nSim]/nSim,col="blue", type="p",pch=20,lwd=2)

这里有一个一般形式的线性同余生成器

Xn+1=(aXn+c)模块m

目标是选择这样的a、c和m,以使生成的序列尽可能类似于随机序列。没有最好的方法来选择a、c和m,但是我们可以很容易地做一些事情

您已经选择了m=10000。然后,我们可以使用一个众所周知的定理(例如,见本文末尾)来选择这样的a和c,即生成的数字只在m步之后才会开始重复

条件1:c和m需要相对素数。我们有m=10000=2454。同时,187不能被2或4整除,所以我们是好的

条件2:如果4除以m,那么4也需要除以a-1。在我们的例子中,137-1=136可以被4:136/4=34整除,所以我们在这里也很好

条件3:如果任何素数p除以m,那么p也需要除以a-1。我们在上一步中已经检查了p=2,因此剩下p=5。但是5不能除以137-1=136!事实上,由于这一点,我们得到了

length(unique(X))
# [1] 2000
也就是说,在长度为10000的序列中,我们只有2000个唯一的数字,这意味着相同的数字重复五次。那么我们需要这样一个a-1可以被4和5整除。这给了很多选择!例如,我们可以选择a=4*5*6+1=121

因此,使用a=121、c=187和m=10000给出

length(unique(X))
# [1] 10000
还有一个阴谋

它仍然有点规律,但肯定比以前好。您可以继续使用满足这三个条件的不同a和c进行实验