添加到100的随机数:Matlab

时间:2011-11-09 11:55:11

标签: matlab random uniform-distribution

[我正在将一个人口编号分成不同的矩阵,并希望现在使用随机数来测试我的代码。]

快速提问,并提前感谢您的帮助 -

如果我使用;

 100*rand(9,1)

将这9个数字添加到100的最佳方法是什么?

我希望0到100之间的9个随机数加起来为100。

是否有内置命令执行此操作,因为我似乎无法找到它。

4 个答案:

答案 0 :(得分:74)

我经常看到这个错误,建议用一个给定的总和生成随机数,一个只使用一个统一的随机集,然后只是缩放它们。但如果你这样做,结果是否真的是随机的?

在二维中尝试这个简单的测试。生成一个巨大的随机样本,然后将它们缩放为总和1.我将使用bsxfun进行缩放。

xy = rand(10000000,2);
xy = bsxfun(@times,xy,1./sum(xy,2));
hist(xy(:,1),100)

如果它们是真正均匀随机的,则x坐标将是均匀的,y坐标也是如此。任何价值都可能同样发生。实际上,对于总和为1的两个点,它们必须沿着连接(x,y)平面中的两个点(0,1),(1,0)的线。要使点均匀,沿该线的任何点都必须具有相同的可能性。

xy histogram

当我使用缩放解决方案时,显然均匀性失败。该线上的任何一点都不太可能。我们可以看到三维中发生同样的事情。在这里的三维图中可以看到,三角形区域中心的点更密集。这是不均匀性的反映。

xyz = rand(10000,3);
xyz = bsxfun(@times,xyz,1./sum(xyz,2));
plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
view(70,35)
box on
grid on

xyzplot

同样,简单的扩展解决方案失败了。它只是不会在感兴趣的领域产生真正统一的结果。

我们可以做得更好吗?嗯,是。 2-d中的一个简单解决方案是生成一个随机数,指定沿连接点(0,1)和1,0的线的距离。

t = rand(10000000,1);
xy = t*[0 1] + (1-t)*[1 0];
hist(xy(:,1),100)

Uniform x+y = 1

可以证明,沿着由等式x + y = 1定义的线的任何点(单位平方)现在同样可能被选择。这可以通过漂亮,扁平的直方图反映出来。

David Schwartz建议的排序技巧是否在n维中起作用?显然它在2-d中这样做,下图显示它在3维中这样做。如果没有深入思考这个问题,我相信它会在n维中对这个基本案例起作用。

n = 10000;
uv = [zeros(n,1),sort(rand(n,2),2),ones(n,1)];
xyz = diff(uv,[],2);

plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
box on
grid on
view(70,35)

Sort trick

还可以从文件交换机Roger Stafford的贡献中下载函数randfixedsum。这是一种更通用的解决方案,可以在单位超立方体中生成真正均匀的随机集,具有任何给定的固定总和。因此,要生成位于单位3立方体中的随机点集,受约束条件它们总和为1.25 ...

xyz = randfixedsum(3,10000,1.25,0,1)';
plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')
view(70,35)
box on
grid on

randfixedsum

答案 1 :(得分:57)

一种简单的方法是在0到100之间选择8个随机数。将0和100添加到列表中以给出10个数字。排序他们。然后输出每对连续数字之间的差异。例如,这是0到100之间的8个随机数:

96,38,95,5,13,​​57,13,20

所以添加0和100并排序。

0,5,13,​​13,20,38,57,95,96,100

现在减去:

5-0 = 5
13-5 = 8
13-13 = 0
20-13 = 7
38-20 = 18
57-38 = 19
95-57 = 38
96-95 = 1
100-96 = 4

你有它,九个数字总和为100:0,1,4,5,7,8,18,19,38。我得到零和一个只是一点点运气。

答案 2 :(得分:2)

给出正确答案还为时不晚

让我们谈谈在[0 ... 1]范围内采样X1 ... XN,使得Sum(X1,...,XN)等于1.然后你可以将它重新缩放到100

这称为Dirichlet distribution,下面是从中采样的代码。最简单的情况是当所有参数都等于1时,X1,...,XN的所有边际分布都是U(0,1)。一般情况下,如果参数不同于1,则边际分布可能具有峰值。

-----------------取自here ---------------------

Dirichlet是单位尺度伽马随机变量的向量,由它们的和进行归一化。所以,没有错误检查,这将得到你:

a = [1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0]; // 9 numbers to sample
n = 10000;
r = drchrnd(a,n)

function r = drchrnd(a,n)
  p = length(a);
  r = gamrnd(repmat(a,n,1),1,n,p);
  r = r ./ repmat(sum(r,2),1,p);

答案 3 :(得分:-1)

获取N-1个数字列表,通过插入0和100创建N + 1个数字列表,对列表进行排序,并将它们向下区分为总共N个数字。