【问题标题】:C++ multiple random numbers adding up to equal a certain numberC++多个随机数加起来等于某个数字
【发布时间】:2013-09-12 12:19:40
【问题描述】:

在弄清楚这一点时遇到了一些麻烦,我有一堆 int 变量,它们生成 1-9 的随机数。我需要他们生成正确的数字以等于某个数字,例如 30。

int numone = rand()%10;
int numtwo = rand()%10;
int numthree = rand()%10;
int numfour = rand()%10;
int finalsum;

do{
finalsum = numone + numtwo + numthree + numfour;
}while(finalsum !=30);

我不确定我是否以正确的方式进行此操作,但是当我尝试编译上述代码时,我什至没有得到一个数字,有时我会收到“超出时间限制”错误,也许它正在占用太长。还有其他方法可以做到这一点吗?

【问题讨论】:

    标签: c++ loops random


    【解决方案1】:

    您获得“30”结果的机会非常小。您也不会得到从 1 到 9 的随机数,而是从 0 到 9。

    试试这个:

    int numone,numtwo,numthree,numfour, finalsum;
    do
    {
       do
       {
         numone = 1+rand()%9;
         numtwo = 1+rand()%9;
       } while (numone+numtwo < 12);
       numthree = 1+rand()%9;
    } while (numone+numtwo+numthree < 21);
    numfour = 30-(numone+numtwo+numthree);
    // for clarity
    finalsum = numone + numtwo + numthree + numfour;
    

    (编辑)经过一些横向思考:numthree 需要介于 30-1-(numone+numtwo)30-9-(numone+numtwo) 之间——也许那里还有进一步优化的空间。

    (进一步编辑)经过下面的审议,我实际上测试了它,确实,这符合要求:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>
    
    int main (void)
    {
      int numone,numtwo,numthree,numfour, finalsum;
      int i;
    
      srand(time(NULL));
    
      for (i=0; i<100; i++)
      {
        numone = 3+rand()%7;
        if (numone == 3)
          numtwo = 9;
        else
          numtwo = 12-numone+rand()%(7-(9-numone));
        if (numone + numtwo == 12)
          numthree = 9;
        else
          numthree = 21-(numone+numtwo)+rand()%(6-(18-(numone+numtwo)));
        numfour = 30 - (numone + numtwo + numthree);
    
        finalsum = numone + numtwo + numthree + numfour;
        printf ("%d + %d + %d + %d = %d\n", numone, numtwo, numthree, numfour, finalsum);
      }
    }
    

    【讨论】:

    • 附加:由于n1+n2sum必须是12..18——至少需要12,其中n3和n4都是9,并且它不能高于 9+9 -- 你也可以更聪明地计算n2。 ..嗯..比我预期的要困难一点:)
    • 另外:所有数字的 1..9 范围无法正常工作!一旦您的任何个数字小于 3,您就无法再达到目标值“30”。所以更好的随机数是3+rand()%7
    • 好的。如果3 &lt;= n1,n2 &lt;= 912 &lt;= n1+n2 &lt;= 18 则n2 至少需要为12-n1。所以n2=12-n1+rand()%(6-(9-n1))。模数 0 是无效的,所以首先测试是否为n1==3,如果是则为n2=9。 (现在要躺下。)
    • 我们快到了:此时,n1+n2 介于 12..18 之间。对于最后一个数字n4 是 1..9(实际上是 3..9),n1+n2+n3 需要是 21..27(你不能做 28 或 29)。正如我们现在知道的n1+n2,您可以说n3=21-(n1+n2)+rand()%(6-(18-(n1+n2))),然后再次测试n1+n2==12,因为然后是n3=9。幸运的是,n4 很容易计算!
    • 啊等等。我在n2n3 中使用的6-.. 可能需要改为7-..。我认为是时候真正尝试了,因为到目前为止我只是在应用逻辑。
    【解决方案2】:

    好吧,我希望你意识到在你的 do while 循环中,你实际上并没有改变随机数的值。你所做的基本上是检查 finalsum = numone + numtwo + numthree + numfour; 的相同条件,如果它不等于 30。你应该做的是:

    int numone,numtwo,numthree,numfour,finalsum;
    do{
    numone=rand()%10;
    numtwo=rand()%10;
    numthree=rand()%10;
    numfour=rand()%10;
    finalsum = numone + numtwo + numthree + numfour;
    }while(finalsum !=30);
    

    【讨论】:

      【解决方案3】:

      rand() 移动到while 循环中,否则您将只生成一次随机数,然后卡在while 循环中。

      do{
      int numone = rand()%10;
      int numtwo = rand()%10;
      int numthree = rand()%10;
      int numfour = rand()%10;
      int finalsum;
      finalsum = numone + numtwo + numthree + numfour;
      }while(finalsum !=30);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 2018-03-01
        相关资源
        最近更新 更多