我要从24个中抽出3个球,并将这些球所代表的总折扣相加。我不允许在抽奖后更换球,因此不能重复绘制球。折扣为1、2、3、4、5、6、7、8,每个都有3。
我对这个问题的解决方法是创建多个while循环,这些循环从24开始滚动并重新滚动,直到没有重复为止。我过去做过这样的循环,它将循环随机数,直到选择了一个非重复项,然后它可以正常工作,所以我以相同的方式设置了该程序。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int draw(int urn[], int draws[]);
int main()
{
int discountSum,discount;
int urn[24]={1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8};
int draws[1000]={0};
draw(urn,draws);
cin >> discount;
int averageDiscount=discount/1000;
return 0;
}
int draw(int urn[], int draws[])
{
static int discountSum=0;
int i; //simulations counter
int ball1, ball2, ball3;
int score1, score2, score3;
int totalDiscount;
srand(time(0));
for(i=0;i<1000;i++)
{
ball1=rand()%24;
while (ball2==ball1)
{
ball2=rand()%24;
}
while ((ball3==ball2)||(ball3==ball1))
{
ball3=rand()%24;
}
score1=urn[ball1];
score2=urn[ball2];
score3=urn[ball3];
totalDiscount=score1+score2+score3;
draws[i]=totalDiscount;
cout << "1) " << draws[i] << " percent discount.\n";
discountSum+=totalDiscount;
}
return discountSum;
}
当我运行此代码时,程序没有接收到错误,而是没有输出运行,并且返回负垃圾值(而不是0)。我希望看到每次折扣直至第1000个循环的输出。
答案 0 :(得分:2)
似乎错误是ball2
和ball3
在被设置为任何东西之前就被比较了。它们甚至从未被初始化,这可能是您“垃圾价值”的原因。如果您在比较之前“绘制”每个球,则可能会起作用,例如:
ball1=rand()%24;
ball2=rand()%24;
while (ball2==ball1)
{
ball2=rand()%24;
}
ball3=rand()%24;
while ((ball3==ball2)||(ball3==ball1))
{
ball3=rand()%24;
}
一种更好的方法是改为使用do
... while
循环,该循环始终运行一次,如下所示:
ball1=rand()%24;
do
{
ball2=rand()%24;
} while (ball2==ball1);
do
{
ball3=rand()%24;
} while ((ball3==ball2)||(ball3==ball1));
答案 1 :(得分:1)
一种更简单的方法是使用C ++标准库中内置的功能:
#include <iostream>
#include <algorithm>
#include <random>
std::mt19937 gen(std::random_device{}()); // initialize random number generator
/*
* or
std::mt19937 gen(std::time(NULL));
* if std::random_device is not well-implemented
*/
int draw()
{
static int urn[24]={1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8};
std::shuffle(std::begin(urn), std::end(urn), gen); // shuffle array
return urn [0] + urn[1] + urn[2]; // pick first three balls from array
}
int main()
{
int discount = draw();
// Use discount. For example,
std::cout << discount;
return 0;
}
文档: