在解决这个问题时遇到一些麻烦,我有一堆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);
我不确定我是否以正确的方式进行此操作但是当我尝试编译上面的代码时,我甚至没有得到一个数字,有时我得到一个“超出时间限制”的错误,也许它正在采取太长。还有其他方法可以做到这一点吗?
答案 0 :(得分:2)
将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);
答案 1 :(得分:2)
好吧,我希望你意识到在你的do while循环中,你实际上并没有改变随机数的值。你正在做的基本上是finalsum = numone + numtwo + numthree + numfour;
无限相同的条件,如果不相等的话你应该做的是:
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);
答案 2 :(得分:0)
你获得'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);
}
}