这是我到目前为止所拥有的。这个程序的重点是,如果有人输入数字1..3
,他们将获得其中一个奖品,但我不希望奖品每次都在同一个门后面。我如何让它们随机,所以也许百万美元在门2后面而不是门1?
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
int doorNumber;
//int door1, door2, door3;
cout << "Pick a door, 1, 2, or 3" << endl;
cin >> doorNumber;
switch (doorNumber) {
case 1:
cout << "you win a million dollars" << endl;
break;
case 2:
cout << "you win detergent" << endl;
break;
case 3:
cout << "you win a dishwasher" << endl;
break;
}
return 0;
}
答案 0 :(得分:1)
case语句需要在编译时必须知道的整数值,因此不能在switch语句中随机移动门号。 但是,您可以在用户的输入中添加一个随机数,并以3为模,并添加一个以将总和投影回1,2或3。
答案 1 :(得分:1)
将奖品放入数组中,然后将该数组洗牌,例如:
#include <iostream>
#include <algorithm>
#include <limits>
int main() {
string prizes[3] = {"a million dollars", "detergent", "a dishwasher"};
int doorNumber;
std::random_shuffle(prizes, prizes+2);
do {
std::cout << "Pick a door: 1, 2, or 3" << std::endl;
std::cin >> doorNumber;
if ((doorNumber >= 1) && (doorNumber <= 3))
break;
std::cout << "Invalid door! Try again" << std::endl;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.clear();
}
while (true);
std::cout << "you win " << prizes[doorNumber-1] << std::endl;
return 0;
}
请注意,std::random_shuffle()
在C ++ 14中已弃用,在C ++中已删除17。您可以改为使用std::shuffle()
:
#include <iostream>
#include <algorithm>
#include <random>
#include <limits>
#include <iterator>
int main() {
string prizes[3] = {"a million dollars", "detergent", "a dishwasher"};
int doorNumber;
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(std::begin(prizes), std::end(prizes), g);
do {
std::cout << "Pick a door: 1, 2, or 3" << std::endl;
std::cin >> doorNumber;
if ((doorNumber >= 1) && (doorNumber <= 3))
break;
std::cout << "Invalid door! Try again" << std::endl;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.clear();
}
while (true);
std::cout << "you win " << prizes[doorNumber-1] << std::endl;
return 0;
}
答案 2 :(得分:0)
您可以为播放器的选择添加随机修改器。如果您事先这样做,它将与每个奖品具有不同的预定门号完全相同。完成切换后,只需将它们加在一起,确保结果在1到3之间。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
int doorNumber;
//int door1, door2, door3;
srand(time(NULL));
int randomNumber = rand() % 3;
// generate a number between 1 and 3
cout << "Pick a door, 1, 2, or 3" << endl;
cin >> doorNumber;
switch ((doorNumber + randomNumber) % 3 + 1) {
case 1:
cout << "you win a million dollars" << endl;
break;
case 2:
cout << "you win detergent" << endl;
break;
case 3:
cout << "you win a dishwasher" << endl;
break;
}
return 0;
}
在开关中不能有不同的门号,因为案例值是在编译期间设置的,因此它们必须是常量值。
答案 3 :(得分:-1)
可以通过声明一个数组并对数组的内容进行混洗。
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main() {
int doorNumber;
int a[2] = {1,2,3};
//int door1, door2, door3;
random_shuffle(&a[0], &a[2]);
cout << "Pick a door, 1, 2, or 3" << endl;
cin >> doorNumber;
switch (doorNumber) {
case a[0]:
cout << "you win a million dollars" << endl;
break;
case a[1]:
cout << "you win detergent" << endl;
break;
case a[2]:
cout << "you win a dishwasher" << endl;
break;
}
return 0;
}
答案 4 :(得分:-1)
你不能像你要的那样'随机化一个开关'。此外,在您要问的问题中,每次运行程序时,用户输入一个数字并显示随机结果;你甚至可以不记录他们的输入,而是记录switch
随机值。
std::vector<std::string>
),然后将其随机化。 C ++和许多其他语言提供标准函数来混洗集合。现在你有随机订购的门系列,你可以让玩家逐个挑选它们,你可以显示他们选择的结果。
最终,我认为你不需要转换或担心如何随机化它。
ps,我没有为此做过代码示例,因为我认为这是一个理论上足够的概念,尽管我可能没有那么好解释,所以请随时要求澄清。
C ++就像
std::vector<std::string> doors = {
"door a", "door b", "door c"};
auto random_doors = std::shuffle_sort(doors); // or something like this
cout << "Enter a door: "
cin >> players_input
cout << "You entered a door and : " << random_doors[players_input];