45

[我将人口数拆分为不同的矩阵,现在想使用随机数测试我的代码。]

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

如果我使用;

 100*rand(9,1)

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

我想要 0 到 100 之间的 9 个随机数,加起来等于 100。

是否有一个内置命令可以执行此操作,因为我似乎找不到它。

4

4 回答 4

89

我经常看到这个错误,建议要生成具有给定总和的随机数,只需使用统一随机集,然后对其进行缩放。但是,如果你这样做,结果真的是均匀随机的吗?

试试这个简单的二维测试。生成一个巨大的随机样本,然后将它们缩放到总和为 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直方图

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

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

坐标图

同样,简单的缩放解决方案失败了。它根本不会在感兴趣的领域产生真正统一的结果。

我们能做得更好吗?嗯,是。二维中的一个简单解决方案是生成一个随机数,该数字指定沿连接点 (0,1) 和 1,0) 的直线的距离。

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

均匀 x+y = 1

可以证明,沿着由方程 x+y = 1 定义的直线上的任何点,在单位正方形中,现在都同样可能被选中。漂亮、平坦的直方图反映了这一点。

David Schwartz 提出的排序技巧是否适用于 n 维?很明显,它在 2-d 中这样做,下图表明它在 3-dimension 中这样做。在没有深入思考这个问题的情况下,我相信它会在 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)

排序技巧

也可以从 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

随机数

于 2011-11-09T17:24:35.207 回答
70

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

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。我得到一个零和一个只是一个奇怪的运气。

于 2011-11-09T12:04:31.703 回答
6

给出正确答案还为时不晚

让我们谈谈在 [0...1] 范围内对 X1...XN 进行采样,使得 Sum(X1, ..., XN) 等于 1。然后您可以将其重新缩放为 100

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

----------------- 取自这里---------------------

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);
于 2017-07-26T21:29:55.390 回答
1

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

于 2016-07-18T07:54:11.193 回答