如何把一个整数随机折分?比如把100随机折分20分,20分加起来必须等于100。谢谢
$all=100; /*** *all 要分配的总数 *times 要分配的次数 *max 分配能够达到的最大值 *min 分配的最小值 * *先采用用户的分配‘最大值’,如果这个分配值大于当前剩余的总数,那这个最大值也就没有意义,就直接用当前剩余的最大值作为参考 */ function distribution($all,$times="",$max="",$min=0){ if($times=="")return 0; if($max==""){$max=$all;} $num=(int)$times; for($i=0;$i<$num;$i++){ if($max>$all){$max=$all;} $tmp=mt_rand($min,$max); $result[]=$tmp; $all-=$tmp; echo $tmp."<br>"; } return $result; } $res=distribution($all,20,5,0); echo array_sum($res);
可作参考
兄弟,你这种方式最终分配的结果求各不能等于总数all
比如要拆分为N份,申请一个数组S,元素个数为N+1,
设要拆分的整数为M,
S[0]=0
for i = 1 range ( 1 , N )
M=M-S[i-1]
if i < N
S[i] =random(M)
else
s[i] = M
next
不知道这样OK吗?
问题等价于:把100 个球 随机放到20个容器中。这样就很简单了。
static void Main(string[] args) { int[] panels = new int[20]; for (var i = 0; i < panels.Length; i++) { panels[i] = 0; } Random random = new Random(); for (var i = 0; i < 100; i++) { int index = random.Next(20); panels[index]++; } for (var i = 0; i < panels.Length; i++) { Console.WriteLine(panels[i]); } Console.ReadKey(); }
@德年: 兄弟,你没有考虑到所有容器里的球加起来总数必须是100个
@小徐的博客: 100个球放到容器中 总数还是100个,不会多,不会少。
这问题其实就是这么简单,你们想复杂了。
我这解法要说没考虑到的就是有些容器中可能球数的个数为0,如果不允许为0的话,就先20个容器中,每个容器先放一个,剩下80个随机放到20个容器中
随机生成20个数,总核算每个数的百分比。乘以原整数。最后补一下误差。OK
楼主是不是要发红包啊~
是啊,兄弟有没有好的算法:)