从100里取5个随机数,要求5次都是随机的,而其这5个随机数相加起来的总和是100!请问,有解决的算法吗?

解决方案 »

  1.   

     private void button1_Click(object sender, EventArgs e)
            {
                int[] intArray = new int[100];
                for (int count = 0; count < intArray.Length; count++)
                {
                    intArray[count] = count;
                }
                bool boolean = true;
                Random rd = new Random();
                int[] tempArray = new int[5];
                while (boolean)
                {
                    int result_value = 0;
                    for (int count = 0; count < 5; count++)
                    {
                        int tempint = intArray[rd.Next(1, 100)];
                        result_value = result_value + tempint;
                        tempArray[count] = tempint;
                    }
                    if (result_value == 100)
                    {
                        boolean = false;
                    }
                }
                for (int count = 0; count < tempArray.Length; count++)
                {
                    MessageBox.Show("数列分别为" + tempArray[count].ToString());
                }
            }
      

  2.   

    用5个嵌套的循环将5个数相加得100的所有组合先存储在一个数组里int[] num,然后根据num的length,从0-num.length-1的数字里随机取个数字i,那么num[i]就为所求了.
      

  3.   


                int temp = 100;
                int[] arr = new int[5];
                int index = 0;
                while (temp > 0)
                {
                    Random r = new Random(Environment.TickCount);
                    int i = r.Next(1, temp + 1);
                    temp -= i;
                    if (temp > 0)
                    {
                        if (index < 4)
                        {
                            arr[index] = i;
                            index++;
                            continue;
                        }
                        else if (index == 4)
                        {
                            temp = 100;
                            index = 0;
                            continue;
                        }
                    }
                    else if (temp == 0)
                    {
                        if (index < 4)
                        {
                            temp = 100;
                            index = 0;
                            continue;
                        }
                        else if (index == 4)
                        {
                            arr[index] = i;
                            break;
                        }
                    }
                }
                StringBuilder sb = new StringBuilder();
                foreach (int i in arr)
                    sb.AppendFormat("{0}+", i);
                Console.WriteLine("{0}=100", sb.ToString().TrimEnd('+'));
      

  4.   

    private void button1_Click(object sender, EventArgs e)
            {
                int[] intArray = new int[100];
                for (int count = 0; count < intArray.Length; count++)
                {//初始化你的数组值
                    intArray[count] = count;
                }
                bool boolean = true;//控制循环变量
                Random rd = new Random();//随机取数变量
                int[] tempArray = new int[5];//临时存放变量至数组
                while (boolean)
                {
                    int result_value = 0;//临时相加结果存放
                    for (int count = 0; count < 5; count++)
                    {
                        int tempint = intArray[rd.Next(1, 100)];//从100个数里随机取一个(有可能重复)
                        result_value = result_value + tempint;//每次取数相加
                        tempArray[count] = tempint;
                    }
                    if (result_value == 100)
                    {
                        boolean = false;
                    }
                }
                for (int count = 0; count < tempArray.Length; count++)//显示
                {
                    MessageBox.Show("数列分别为" + tempArray[count].ToString());
                }
            }
      

  5.   

    private void button1_Click(object sender, EventArgs e)
            {
                bool boolean = true;//控制循环变量
                Random rd = new Random();//随机取数变量
                int[] tempArray = new int[5];//临时存放变量至数组
                while (boolean)
                {
                    int result_value = 0;//临时相加结果存放
                    for (int count = 0; count < 5; count++)
                    {
                        int tempint = rd.Next(1, 100);//从100个数里随机取一个(有可能重复)
                        result_value = result_value + tempint;//每次取数相加
                        tempArray[count] = tempint;
                    }
                    if (result_value == 100)
                    {
                        boolean = false;
                    }
                }
                for (int count = 0; count < tempArray.Length; count++)//显示
                {
                    MessageBox.Show("数列分别为" + tempArray[count].ToString());
                }
            }
      

  6.   

    前4个数加起来本来就大于100呢??我觉得应该是:
    1, 第一次  生成随机数n1=random(100)
    2. 第二次  生成随机数random(100-n1)
    3. 第三次  生成随机数random(100-n1-n2)
    ...
    直到取出5个数 
      

  7.   

    1:如果5个数可以重复,简单点
     int[] aa=new int[5];
     Random random=new Random();
     for(i=0;i<5;i++)
     {
        if(i==0)
            aa[i]=random.next(0,100);
        else
            aa[i]=random.next(0,(100-a[i-1]));
     }
    2:如果5个数不可以重复(这方法效率不太好感觉,等高手)
    int[] aa=new int[5];
    Random random=new Random();
    //得到5个不同随机数
    prvate void Random_F()
    {
        for (int i = 0; i < 5; i++)  
    {
        int temp;
        if (i == 0)
           aa[i] = random.Next(0, 100);
        else
       {
           temp = random.Next(0, 100);
           for (int j = 0; j < i; j++)
           {
             if (aa[j] == temp)
             {
                temp = random.Next(0, 100);
                aa[i] = temp;
                j = -1;
             }
             else
             {
                aa[i] = temp;
             }
          }
        }
      }
    }
    //判断5个数的和是否是100,如果不是重新获取5个不同随机数
     for(int k=0;k<5;k++)
     {
        int sum=0;
        sum+=aa[k];
        if(sum!=100)
            Random_F();
     }
      

  8.   

     private void getFhundred()
            {
                Random tempdata = new Random();
                int[] temp = new int[5] ;
                bbs:for (int i = 0; i < 5; i++)
                    {
                        temp[i] = tempdata.Next(1, 100);
                    }
                int tempsum = temp[1] + temp[2] + temp[3] + temp[4] + temp[0];
                if (tempsum == 100)
                {
                    MessageBox.Show(temp[1].ToString() + "," + temp[2].ToString() + "," + temp[3].ToString() + "," + temp[4].ToString() + "," + temp[0].ToString());
                }
                else
                {
                    goto bbs;
                }        }
      

  9.   

    怎么就看不出了
    假如你取一个随机数是60,那么你第二个随机数是在0-40中取,如果是20,第3个随机数在0-20中取。
    极端的情况是第一数就是100,那么以后的数都在random.next(0,0)中取
      

  10.   


    这个算法的问题就是不断缩小Random.Next()
    的范围,这样就不算是每次从100里面抽取吧
    还有就是可能会出现重复1的情况~
      

  11.   

    非常同意楼上的,既然有等于100的硬性条件,那就是说,如果随机了前四个,且前是4个的和小于100,那第五个必然是确定的
    所以,            int[] data = new int[5];
                Random r = new Random();
                int MaxValue = 100;
                for (int nI = 0; nI < 5; nI++)
                {
                    if (nI + 1 == 5)
                    {
                        data[nI] = MaxValue;
                    }
                    else
                    {
                        data[nI] = r.Next(0, MaxValue);
                        MaxValue = MaxValue - data[nI];
                    }
                }
      

  12.   

    算法,
    第一次取1到90之间的随机数。第一次得到数a
    第二次取1 到 100-a-6 之间的随机数,得到数b,若a==b,重复第二部。
    第三次取1到 100-a-b-3之间的随机数,得到数c,若a==c or b==c 重复第三步。
    第四次取1到 100-a-b-c-1之间的随机数,得到数d,若a===d or b==d or c==d重复第四步。
    第五次不用取了100-a-b-c-d为数e.若e==a or e==b or e==c or e===d 返回第二步,否则得到满足条件随机数a,b,c,c,e
      

  13.   

                int sum = 100;
                Random r = new Random();
                var NumberList = new List<int>();
                for (int i = 1; i <=100; i++)
                {
                    NumberList.Add(i);
                }
                var randomList = new List<int>();
                for (int i = 0; i < 4; i++)
                {
                    var index = r.Next(NumberList.Count-1);
                    randomList.Add(NumberList[index]);
                }
                
    第五个数可以算出来,只说取不同随机数的一个方法,中间涉及到不合理数判断没做,
    例如:第一个随机数如果大于90,肯定不能取到 5个不同的和为100的数,
    原因简单:100以内最小4个随机数为1,2,3,4--->第五个数为90,如大于90,就凑不到另外几个数了
      

  14.   

                int sum = 100;
                Random r = new Random();
                var NumberList = new List<int>();
                for (int i = 1; i <=100; i++)
                {
                    NumberList.Add(i);
                }
                var randomList = new List<int>();
                for (int i = 0; i < 4; i++)
                {
                    var index = r.Next(NumberList.Count-1);
                    randomList.Add(NumberList[index]);
                    NumberList.RemoveAt(index);
                }上面的代码少了一个NumberList.RemoveAt(index);
      

  15.   


      private static int[] GetRandom(out int sum, int size)
            {            Random random = new Random();
                int temp = 0;
                int[] intList = new int[size];
                bool flag = true;            do
                {
                    sum = 0;
                    for (int i = 0; i < 5; i++)
                    {
                        temp = random.Next(1, 100 - temp);
                        intList[i] = temp;
                        sum += temp;
                    }
                    if (sum == 100)
                        flag = false;            } while (flag);            return intList;
            }