我想生成几十个随机数,但它们求和后(合计)的数是我已预先设定的

来源:百度知道 编辑:UC知道 时间:2024/06/13 21:18:34
假设我先一个合计数为25186,我要生成的几十个随机数的总和就是25816.
我的意思是说生成的几十个随机数的和必须等于我原定已知的数字.

既然所有的数字之和是S,那么就不可能所有的数字之间没有关系了.
先说说你的数字都是非负数吧.假定共n个数字,
如果你的最小值有限制假定最小值是m,则
先从总数S中减去mn得A1,
然后用随机函数B1=A1*Random+m,A2=A1-B1,
B2=A2*Random+m,A3=A2-B2,
B3=A3*Random+m,A4=A3-B3,
...
B(n-1)=A(n-1)*Random+m,
Bn=A(n-1)-B(n-1).

后来我想到了另一个好的办法,而且产生的各个数字相差不大.
S = 25186;(*各数之和*)
n = 30;(*总共n个数字*)
m = 13;(*其中最小的数字不小于m*)
arr = ConstantArray[m, n];(*先让各个数字取到最小值*)
For[i = S - m*n, i > 0, i--,(*i从剩下的数字开始减,每次减1*)
p = Floor[n*Random[] + 1];(*产生随机产生1~n之间的数字p*)
arr[[p]]++;(*让第p个数字加1*)
];
arr(*显示最终生成的n个数字*)
Sum[arr[[i]], {i, 1, n}](*检验所有数字之和是否为S*)

下面是生成的数字:
{808, 854, 849, 819, 894, 822, 806, 836, 859, 818, 836, 824, 846, 870, 859, 830, 858, 816, 887, 819, 803, 803, 826, 830, 841, 829, 824,
926, 826, 868}

这是检验的结果:
25186

第二种办法的好处是产生的各个数字很接近.

我的做法是这样的
(1)先生成9个0~1上的均匀分布的随机数,这个很容易做到,C语言就可以,用语句rand()/32767就行。
(2)将这是9个数都乘以25186,得到的就是