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+n2
的sum必须是12..18——至少需要12,其中n3和n4都是9
,并且它不能高于 9+9 -- 你也可以更聪明地计算n2
。 ..嗯..比我预期的要困难一点:)
另外:所有数字的 1..9 范围无法正常工作!一旦您的任何个数字小于 3,您就无法再达到目标值“30”。所以更好的随机数是3+rand()%7
。
好的。如果3 <= n1,n2 <= 9
和12 <= n1+n2 <= 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
很容易计算!
啊等等。我在n2
和n3
中使用的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++多个随机数加起来等于某个数字的主要内容,如果未能解决你的问题,请参考以下文章