MATLAB - 使用同余RNG绘制圆中的随机点

时间:2015-09-21 15:37:23

标签: matlab plot

我的目标是使用MATLAB在一个圆圈中绘制一些随机数。我的代码:

c = 3; p = 31; x = [7];

% generating random numbers (z) in the range [0,1) using 
% congruential random number generator (multiplicative)

for i = 2:200;
x(i) = mod(c*x(i-1),p);
end;
z = x/p;

% plot unit circle
hold on;
theta = 0:pi/50:2*pi;
plot(cos(theta),sin(theta),'.');
hold off;

% plotting random points in the unit circle using in-built rand function
phi = 2*pi*rand(1,200);
r = 1*sqrt(rand(1,200));

% plotting random points using the RNG above
% phi = 2*pi*z;
% r = 1*sqrt(z);

hold on;
x = 0 + r.*cos(phi);
y = 0 + r.*sin(phi);
plot(x,y,'r*');
hold off;
clear;

我面临的问题是zrand都包含[0,1]范围内的随机数。但是,当我使用rand绘图时,我得到了理想的结果 - enter image description here

虽然z给了我一个螺旋式的东西 - enter image description here

可能是什么问题?

2 个答案:

答案 0 :(得分:3)

除了Ander关于RNG的好处之外,还存在对zphi使用r的问题。使用z=rand(200,1)进行检查,然后创建绘图: helixcircle

给出与之前相同的结果。如果你让z两者都不同,那么你在RNG中会得到“真实”的随机性。我用过这个RNG:

c = 991;
p = 997;
x=zeros(400,1);
x(1,1) = 7;
for ii = 2:400;
    x(ii,1) = mod(c*x(ii-1),p);
end;
z = x/p;
phi2 = 2*pi*z(1:200,1);
r2 = 1*sqrt(z(201:400,1));

我让你的RNG运行一段时间,然后将前200个用于phi,将最后200个用于r

semi-rand circle

正如你所看到的,仍有某种漩涡可见,但这是由你的RNG造成的。您选择的cp越大,就越少。

通过设置c=3p=31以及如上所述使用完整的400 z范围来向您展示您的RNG变得多么漂亮。这不是一个伟大的漩涡吗?

Swirly

答案 1 :(得分:2)

轻松!你的随机数生成器对某些人有好处。

基于素数除法的随机数生成器通常具有句点。经过一些样本后,他们重复了一遍。

在您的情况下,请尝试/passive

enter image description here

你会注意到这组数字是周期性的,有31个句号。巧合?

我没想到!

因此,请记住,当您想要生成伪随机数时,您需要比您想要生成的样本数量大plot(z)

例如,如果我们选择另一组互质数来生成p

z

c = 991; p = 997; 将是:

enter image description here

最后的情节:

enter image description here