C++多个随机数加起来等于某个数字

Posted

技术标签:

【中文标题】C++多个随机数加起来等于某个数字【英文标题】:C++ multiple random numbers adding up to equal a certain number 【发布时间】: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);

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

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于C++多个随机数加起来等于某个数字的主要内容,如果未能解决你的问题,请参考以下文章

加到 100 的随机数:Matlab

如何在数组中生成随机数,加起来达到定义的总数?

在 C++ 中生成随机双精度数

某个范围内的随机数c ++ [重复]

如果列表项在swift中等于某个数字,是不是可以进行if语句?

mysql如何查询某字段里两个值相加结果等于已知道的一个数字