首页 新闻 会员 周边 捐助

如何把一个整数随机折分?比如把100随机折分20分,20分加起来必须等于100

0
[已解决问题] 解决于 2015-07-02 09:11

如何把一个整数随机折分?比如把100随机折分20分,20分加起来必须等于100。谢谢

小徐的博客的主页 小徐的博客 | 初学一级 | 园豆:15
提问于:2015-06-05 13:57
< >
分享
最佳答案
0
$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);
可作参考
奖励园豆:5
大匠 | 菜鸟二级 |园豆:207 | 2015-06-05 15:17

兄弟,你这种方式最终分配的结果求各不能等于总数all

小徐的博客 | 园豆:15 (初学一级) | 2015-06-06 18:19
其他回答(4)
0

比如要拆分为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吗?

BWind~ | 园豆:196 (初学一级) | 2015-06-05 14:58
0

问题等价于:把100 个球 随机放到20个容器中。这样就很简单了。

德年 | 园豆:1010 (小虾三级) | 2015-06-05 15:02
 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();
        }

 

支持(0) 反对(0) 德年 | 园豆:1010 (小虾三级) | 2015-06-05 15:07

@德年: 兄弟,你没有考虑到所有容器里的球加起来总数必须是100个

支持(0) 反对(0) 小徐的博客 | 园豆:15 (初学一级) | 2015-06-06 18:21

@小徐的博客: 100个球放到容器中 总数还是100个,不会多,不会少。

这问题其实就是这么简单,你们想复杂了。

我这解法要说没考虑到的就是有些容器中可能球数的个数为0,如果不允许为0的话,就先20个容器中,每个容器先放一个,剩下80个随机放到20个容器中

支持(0) 反对(0) 德年 | 园豆:1010 (小虾三级) | 2015-06-07 12:32
0

随机生成20个数,总核算每个数的百分比。乘以原整数。最后补一下误差。OK

吴瑞祥 | 园豆:29449 (高人七级) | 2015-06-05 15:04
0

楼主是不是要发红包啊~

NetRube | 园豆:277 (菜鸟二级) | 2015-06-07 16:15

是啊,兄弟有没有好的算法:)

支持(0) 反对(0) 小徐的博客 | 园豆:15 (初学一级) | 2015-07-02 09:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册