我经常看到这样的错误:要用给定的和来生成随机数,我们只需要使用一个一致的随机集,并且只需对它们进行缩放。但是,如果你这样做的话,结果真的都是随机的吗?
在两个维度上尝试这个简单的测试。生成一个巨大的随机样本,然后将它们缩放为1。我将使用bsxfan来进行缩放。xy = rand(10000000,2);xy = bsxfun(@times,xy,1./sum(xy,2));hist(xy(:,1),100)
如果它们是真正一致随机的,那么x坐标就会是一致的,就像y坐标一样。任何价值都同样有可能发生。实际上,对于两点和1,它们必须沿着(0,1),(1,0)两个点在(x,y)平面上的连线。如果要使点是一致的,沿这条线的任何点都必须是同样可能的。
显然,当我使用缩放解时,均匀性会失败。这条线上的任何一点都不太可能。我们可以看到同样的事情发生在三维。请注意,在这里的三维图中,三角形区域中心的点更加密集。这是不一致的反映。xyz = rand(10000,3);xyz = bsxfun(@times,xyz,1./sum(xyz,2));plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')view(70,35)box ongrid on
同样,简单的缩放解决方案也失败了。它根本没有在感兴趣的领域产生真正一致的结果。
我们能做得更好吗?嗯,是的。二维中的一个简单解决方案是生成一个随机数,表示连接点(0,1)和1,0的直线上的距离。t = rand(10000000,1);xy = t*[0 1] + (1-t)*[1 0];hist(xy(:,1),100)
可以证明,单位方格中方程x+y=1所定义的直线上的任何点现在都同样有可能被选择。这反映在漂亮的,平坦的直方图。
大卫·施瓦茨提出的分类技巧在n维中有效吗?很明显,它是在二维中这样做的,下面的数字表明它是在三维的情况下这样做的。在没有深入考虑这个问题的情况下,我相信它将适用于这个基本的问题,在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 ongrid onview(70,35)
还可以下载该功能。随机固定笔在文件交换中罗杰·斯塔福德的贡献。这是在单位超立方体中生成真正一致的随机集的更一般的解,具有任意给定的固定和。因此,若要生成位于单元3-立方体中的随机点集,其约束条件是它们之和为1.25.xyz = randfixedsum(3,10000,1.25,0,1)';plot3(xyz(:,1),xyz(:,2),xyz(:,3),'.')view(70,35)box ongrid on