我正在将一个人口数量分成不同的矩阵,并希望现在使用随机数来测试我的代码。
大家好,有个快速问题,请提前感谢您的帮助 -
如果我使用;
100*rand(9,1)
如何让这9个数字相加等于100?
我想要9个在0到100之间的随机数,它们加起来等于100。
是否有内置命令可以实现这个目标,因为我找不到。
我正在将一个人口数量分成不同的矩阵,并希望现在使用随机数来测试我的代码。
大家好,有个快速问题,请提前感谢您的帮助 -
如果我使用;
100*rand(9,1)
如何让这9个数字相加等于100?
我想要9个在0到100之间的随机数,它们加起来等于100。
是否有内置命令可以实现这个目标,因为我找不到。
xy = rand(10000000,2);
xy = bsxfun(@times,xy,1./sum(xy,2));
hist(xy(:,1),100)
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定义的直线上的任何点现在被等概率地选择。这通过漂亮的平坦直方图反映出来。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)
您还可以从文件交换中下载 randfixedsum 函数,这是 Roger Stafford 贡献的一个更通用的解决方案,可以在单位超立方体内生成具有任何给定固定和的真正均匀的随机集合。因此,要生成在单位 $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。我得到一个零和一个一只是奇怪的运气而已。
- Doody Pa = [0] + sorted([random.random()*100 for _ in range(9-1)]) + [100] b = [a[i+1] - a[i] for i in range(len(a)-1)] sum(b) == 100
现在给出正确的答案还不算太晚。
我们来谈谈在区间[0...1]内对X1...XN进行抽样,使得Sum(X1, ..., XN)等于1。然后你可以将它重新缩放到100。
这被称为Dirichlet分布,下面是从中抽样的代码。最简单的情况是所有参数都等于1,那么X1, ..., XN的所有边际分布将是U(0,1)。在一般情况下,具有与1不同的参数的边际分布可能会有峰值。
----------------- 取自这里 ---------------------
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的数字。