[我将人口数拆分为不同的矩阵,现在想使用随机数测试我的代码。]
快速提问,并提前感谢您的帮助-
如果我使用;
100*rand(9,1)
使这 9 个数字加到 100 的最佳方法是什么?
我想要 0 到 100 之间的 9 个随机数,加起来等于 100。
是否有一个内置命令可以执行此操作,因为我似乎找不到它。
[我将人口数拆分为不同的矩阵,现在想使用随机数测试我的代码。]
快速提问,并提前感谢您的帮助-
如果我使用;
100*rand(9,1)
使这 9 个数字加到 100 的最佳方法是什么?
我想要 0 到 100 之间的 9 个随机数,加起来等于 100。
是否有一个内置命令可以执行此操作,因为我似乎找不到它。
我经常看到这个错误,建议要生成具有给定总和的随机数,只需使用统一随机集,然后对其进行缩放。但是,如果你这样做,结果真的是均匀随机的吗?
试试这个简单的二维测试。生成一个巨大的随机样本,然后将它们缩放到总和为 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) 的直线上。为了使点均匀,沿该线的任何点必须具有相同的可能性。
当我使用缩放解决方案时,显然均匀性失败了。这条线上的任何点都不太可能。我们可以看到同样的事情在 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 定义的直线上的任何点,在单位正方形中,现在都同样可能被选中。漂亮、平坦的直方图反映了这一点。
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
一种简单的方法是在 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。我得到一个零和一个只是一个奇怪的运气。
给出正确答案还为时不晚
让我们谈谈在 [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);
获取 N - 1 个数字的列表,通过插入 0 和 100 创建一个 N + 1 个数字的列表,对列表进行排序,然后将它们区分为总共 N 个数字。