所以,我正在制作一个程序,你可以在其中添加大理石。你选择你想要的颜色,然后你想要添加的大理石的数量,然后选择那种颜色大理石是酷,无聊或奇怪的。所以,如果你想添加10个蓝色大理石,那么你选择了酷。你将有十个大理石和十个大理石,蓝色和凉爽。我去添加后已存储的大理石中的随机大理石。出于某种原因,它根本不起作用。我尝试获取一个随机数,并将该随机数分配给已添加的当前大理石的描述。假设生成的随机数为1,它将删除“红色酷大理石”。我显然无法删除未添加的大理石,因此我添加了一个do - while
循环,它基本上循环回通过随机数生成器,直到找到满足条件的数字。这是我的代码,有什么想法吗? :
我试着改变我的Do while循环的位置。
void remove() {
do {
srand(time(0));
randomnum = (rand () % max) +1 ;
if (randomnum == 1 && redcool > 0) {
red--;
redcool--;
cout << "The random marble removed was a red and cool marble" <<endl;
}
else if (randomnum == 2 && redweird > 0) {
cout << "The random marble removed was a red and weirdl marble" <<endl;
red--;
redweird--;
}
else if (randomnum == 3 && redboring > 0) {
cout << "The random marble removed was a red and boring marble" <<endl;
red--;
redboring--;
}
else if (randomnum == 4 && greencool > 0) {
cout << "The random marble removed was a green and cool marble" <<endl;
green--;
greencool--;
}
else if (randomnum == 5 && greenweird > 0) {
cout << "The random marble removed was a green and weird marble" <<endl;
green--;
greenweird--;
}
else if (randomnum == 6 && greenboring > 0) {
cout << "The random marble removed was a green and boring marble" <<endl;
greenboring--;
green--;
}
else if (randomnum == 7 && bluecool > 0) {
cout << "The random marble removed was a green and cool marble" <<endl;
blue--;
bluecool--;
}
else if (randomnum == 8 && blueboring >0) {
cout << "The random marble removed was a blue and cool marble" <<endl;
blue--;
blueboring--;
}
else if (randomnum == 9 && blueweird > 0) {
cout << "The random marble removed was a blue and weird marble" <<endl;
blue--;
blueweird--;
}
}while (randomnum == 1 && redcool > 0 || randomnum == 2 && redweird >0 || randomnum == 3
&& redboring > 0 || randomnum == 4 && greencool > 0 || randomnum == 5 && greenweird >0 || randomnum == 6
&& greenboring > 0 || randomnum == 7 && bluecool > 0 || randomnum == 8 && blueweird >0 || randomnum == 9
&& blueboring > 0);
bag--;
预期的结果会说我添加了十个蓝色和凉爽的大理石。当我去除一块随意的大理石时,它将减少一块蓝色和凉爽的大理石,因为这是袋子里唯一的价值。目前,甚至没有任何东西被删除。
原始问题中的代码因为randomnum == 7
有一个多余的案例而存在缺陷。通过在循环中使用srand
来编辑代码是有缺陷的。
样本工作代码与原始代码的变化很小:
#include <iostream>
#include <cstdlib>
using namespace std;
void remove(void)
{
int max = 9;
int randomnum;
int redcool = 2;
int redweird = 2;
int redboring = 2;
int red = redcool + redweird + redboring;
int greencool = 2;
int greenweird = 2;
int greenboring = 2;
int green = greencool + greenweird + greenboring;
int bluecool = 2;
int blueweird = 2;
int blueboring = 2;
int blue = bluecool + blueweird + blueboring;
int bag = red+green+blue;
srand(time(0));
do
{
randomnum = (rand() % max) + 1;
if (randomnum == 1 && redcool > 0)
{
red--;
redcool--;
cout << "The random marble removed was a red and cool marble" << endl;
}
else if (randomnum == 2 && redweird > 0)
{
cout << "The random marble removed was a red and weird marble" << endl;
red--;
redweird--;
}
else if (randomnum == 3 && redboring > 0)
{
cout << "The random marble removed was a red and boring marble" << endl;
red--;
redboring--;
}
else if (randomnum == 4 && greencool > 0)
{
cout << "The random marble removed was a green and cool marble" << endl;
green--;
greencool--;
}
else if (randomnum == 5 && greenweird > 0)
{
cout << "The random marble removed was a green and weird marble" << endl;
green--;
greenweird--;
}
else if (randomnum == 6 && greenboring > 0)
{
cout << "The random marble removed was a green and boring marble" << endl;
greenboring--;
green--;
}
else if (randomnum == 7 && bluecool > 0)
{
cout << "The random marble removed was a blue and cool marble" << endl;
blue--;
bluecool--;
}
else if (randomnum == 8 && blueweird > 0)
{
cout << "The random marble removed was a blue and weird marble" << endl;
blue--;
blueweird--;
}
else if (randomnum == 9 && blueboring > 0)
{
cout << "The random marble removed was a blue and boring marble" << endl;
blue--;
blueboring--;
}
} while (
randomnum == 1 && redcool > 0 ||
randomnum == 2 && redweird > 0 ||
randomnum == 3 && redboring > 0 ||
randomnum == 4 && greencool > 0 ||
randomnum == 5 && greenweird > 0 ||
randomnum == 6 && greenboring > 0 ||
randomnum == 7 && bluecool > 0 ||
randomnum == 8 && blueweird > 0 ||
randomnum == 9 && blueboring > 0);
bag--;
std::cout << "redcool = " << redcool << ".\n";
std::cout << "redweird = " << redweird << ".\n";
std::cout << "redboring = " << redboring << ".\n";
std::cout << "red = " << red << ".\n";
std::cout << "greencool = " << greencool << ".\n";
std::cout << "greenweird = " << greenweird << ".\n";
std::cout << "greenboring = " << greenboring << ".\n";
std::cout << "green = " << green << ".\n";
std::cout << "bluecool = " << bluecool << ".\n";
std::cout << "blueweird = " << blueweird << ".\n";
std::cout << "blueboring = " << blueboring << ".\n";
std::cout << "blue = " << blue << ".\n";
std::cout << "bag = " << bag << ".\n";
}
int main(void)
{
remove();
}
请注意,当任何类别开始为空时,此代码将在随机数生成选中后立即停止。如果希望仅在类别从非空转换为空时停止,则必须进行更改。一种方法是使用另一个变量来指示是否已经看到这样的转换。在下面的代码中,当刚刚更改的计数器变为零时,名为trigger
的变量设置为1:
#include <iostream>
#include <cstdlib>
using namespace std;
void remove(void)
{
int max = 9;
int randomnum;
int redcool = 0;
int redweird = 0;
int redboring = 0;
int red = redcool + redweird + redboring;
int greencool = 0;
int greenweird = 0;
int greenboring = 0;
int green = greencool + greenweird + greenboring;
int bluecool = 10;
int blueweird = 0;
int blueboring = 0;
int blue = bluecool + blueweird + blueboring;
int bag = red+green+blue;
srand(time(0));
int trigger = 0;
do
{
randomnum = (rand() % max) + 1;
if (randomnum == 1 && redcool > 0)
{
red--;
redcool--;
trigger = redcool == 0;
cout << "The random marble removed was a red and cool marble" << endl;
}
else if (randomnum == 2 && redweird > 0)
{
cout << "The random marble removed was a red and weird marble" << endl;
red--;
redweird--;
trigger = redweird == 0;
}
else if (randomnum == 3 && redboring > 0)
{
cout << "The random marble removed was a red and boring marble" << endl;
red--;
redboring--;
trigger = redboring == 0;
}
else if (randomnum == 4 && greencool > 0)
{
cout << "The random marble removed was a green and cool marble" << endl;
green--;
greencool--;
trigger = greencool == 0;
}
else if (randomnum == 5 && greenweird > 0)
{
cout << "The random marble removed was a green and weird marble" << endl;
green--;
greenweird--;
trigger = greenweird == 0;
}
else if (randomnum == 6 && greenboring > 0)
{
cout << "The random marble removed was a green and boring marble" << endl;
greenboring--;
green--;
trigger = greenboring == 0;
}
else if (randomnum == 7 && bluecool > 0)
{
cout << "The random marble removed was a blue and cool marble" << endl;
blue--;
bluecool--;
trigger = bluecool == 0;
}
else if (randomnum == 8 && blueweird > 0)
{
cout << "The random marble removed was a blue and weird marble" << endl;
blue--;
blueweird--;
trigger = blueweird == 0;
}
else if (randomnum == 9 && blueboring > 0)
{
cout << "The random marble removed was a blue and boring marble" << endl;
blue--;
blueboring--;
trigger = blueboring == 0;
}
} while (!trigger);
bag--;
std::cout << "redcool = " << redcool << ".\n";
std::cout << "redweird = " << redweird << ".\n";
std::cout << "redboring = " << redboring << ".\n";
std::cout << "red = " << red << ".\n";
std::cout << "greencool = " << greencool << ".\n";
std::cout << "greenweird = " << greenweird << ".\n";
std::cout << "greenboring = " << greenboring << ".\n";
std::cout << "green = " << green << ".\n";
std::cout << "bluecool = " << bluecool << ".\n";
std::cout << "blueweird = " << blueweird << ".\n";
std::cout << "blueboring = " << blueboring << ".\n";
std::cout << "blue = " << blue << ".\n";
std::cout << "bag = " << bag << ".\n";
}
int main(void)
{
remove();
}