我经常看到这个错误,建议要生成具有给定总和的随机数,只需使用统一的随机集,然后对它们进行缩放。但如果这样做的话,结果真的是均匀随机的吗?
在二维中尝试这个简单的测试。生成一个巨大的随机样本,然后将它们缩放到总和为 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 维图中,三角形区域中心的点更加密集。这是不均匀性的反映。
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 维中这样做的,下图表明它是在 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)
还可以下载该功能兰特固定总和 http://www.mathworks.com/matlabcentral/fileexchange/9700-random-vectors-with-fixed-sum从文件交换来看,罗杰·斯塔福德的贡献。这是一个更通用的解决方案,可以在单位超立方体中生成真正均匀的随机集,具有任何给定的固定总和。因此,为了生成位于单位 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