搜尋

首頁  >  問答  >  主體

php - 用程序生成n个随机数,要求n个数的和等于100

想破了头,也没想出来怎么算!!!

迷茫迷茫2795 天前1839

全部回覆(25)我來回復

  • 阿神

    阿神2017-04-10 16:36:47

    采用数学的方法来解决这个问题
    (1)类似于快速排序的方法,一定有一个数大而一个数小
    (2)通过类似于高斯当年解决1+。。。+100的想法

    `#coding=utf-8
    import random
    
    def foo(n, m):
        mid = m * 2 // n
        duo = m - mid * n // 2
        numbers = [random.randint(0,mid) for _ in range(n // 2)]
        numbers1 = [mid-i for i in numbers]
        numbers.extend(numbers1)
        numbers[0] = numbers[0] + duo
        if(n%2):
            numbers.append(mid//2)
        return [i for i in numbers]
    
    if __name__ == '__main__':
        res = foo(9,100)
        print('10个数为:', res)
        print('它们的和为:', sum(res))`

    回覆
    0
  • PHPz

    PHPz2017-04-10 16:36:47

    微信红包 算法

    回覆
    0
  • 黄舟

    黄舟2017-04-10 16:36:47

    很简单,用个循环,采用概率随机数的方法
    rand(1,100) 随机出来一个,然后通过减法算出下次的区间比如
    rand(1,87) 一直循环,最后一直到剩下的数字作为n次的数字

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:36:47

    来个JavaScript的:每次生成一个余下范围的

    
    // n是个数,v是总和
    
    function lessANumber(n, v) {
        var i,
            s = 0,
            r = [],
            x = v;
    
        for (i = 1; i < n; i++) {
            x = Math.random() * x;
            r.push(x);
            s += x;
            x = v - s;
        }
    
        r.push(x);
    
        return r;
    }
    

    回覆
    0
  • 迷茫

    迷茫2017-04-10 16:36:47

    这是到目前为止题主的说明,在题主自己回答的答案中,提供了另外一个条件,不能有数为零。
    所以没有任何说明这个数是什么数,从题主的回答来看也不能是负数。那么我们记题主用来生成这种数的基本的随机数产生函数为函数fn。
    1, 使用函数fn,生成N - 1个数大于0,小于100的数,如果相同则舍弃该数,再生产一个
    2, 将这N - 1个函数升序排列,在首尾添加0与100,形成N + 1个数的数列A(因为数不能是负数)
    3, 计算数列A相邻元素的差值并存入集合S
    则集合S即为所需的数集。

    • 如果每个数有最值限制,比如大于a,小于b。已经可以转化再使用上述思路解决。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:36:47

    你想弄红包算法?

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-10 16:36:47

    假定要求生成的数是整数,如果不要求整数,处理更简单些,还去掉一些限制。
    代码如下:

    public class Test {
        public static void main(String[] args) {
            try {
                Test.createN(1, 100);
                Test.createN(3, 100);
                Test.createN(5, 100);
                Test.createN(10, 100);
                Test.createN(99, 100);
                Test.createN(100, 100);
                Test.createN(101, 100);
            } catch (Exception ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        public static void createN(int n, int t) throws Exception {
            
            if(n>t) {
                throw new Exception("Error parameter n("+n+") > t("+t+")");
            }
            
            int total = t;
            int[] numbers = new int[n];
            
            for(int i=0; i<n-1; i++) {
                numbers[i] = new Random().nextInt(total-n+1);
                total -= numbers[i];
                if(total == n-1-i) {
                    for(int k=n-1; k>i; k--) {
                        numbers[k] = 1;
                    }
                    break;
                }
            }
            numbers[n-1] = total;
            
            
            // check
            System.out.println(Arrays.toString(numbers));
            int s = 0;
            for(int i=0; i<n; i++) {
                s += numbers[i];
            }
            System.out.println("The sum is "+s);
        }
    }
    

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:36:47

    想了一下,我是这样实现的

    function numsNone(n){
        var nums = [],
            result = 0;
        for(var i=0; i<n; i++){
            nums.push(Math.floor((Math.random() * 100)));
            result += nums[i];
        }
        if(result === 100){
            console.log(nums);
            return nums;
        }else{
            return numsNone(n);
        }
    }
    
    numsNone(3);

    回覆
    0
  • PHPz

    PHPz2017-04-10 16:36:47

    sPeng的答案最好,其他说每次取随机数后把随机数范围减小的算法在分布上不够随机

    回覆
    0
  • 迷茫

    迷茫2017-04-10 16:36:47

    // 用程序生成n个随机数,要求n个数的和等于100
    function ssum($num,$sum)
    {
        $numArr = [];
        $top = $sum-$num+1;
        while(true){
        $tmp = rand(1,$top);
        $numArr[] = $tmp;
        $sum = $sum-$tmp;
        $top = $sum;
        $num--;
            if($num == 1){
                $numArr[] = $top;
                break;
            }
        }
        return $numArr;
    }

    回覆
    0
  • 取消回覆