如何随机化开关

How to randomize a switch?

本文关键字:开关 随机化      更新时间:2023-10-16

这就是我目前所拥有的。这个项目的重点是,如果有人输入数字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;
}

case语句需要整数值,而整数值必须在编译时已知,因此您不能在switch语句中随机移位doors数。然而,您可以在用户的输入中添加一个随机数,并用3取模,然后添加一,将总和投影回1,2或3。

将奖品放入一个数组中,然后洗牌该数组,例如:

#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;
}

您可以在玩家的选择中添加一个随机修改器。如果你事先这样做,这将与每个奖品的预定门牌号码完全相同。完成切换后,只需将它们相加,并确保结果在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;
}

开关中不能有不同的门编号,因为大小写值是在编译过程中设置的,所以它们必须是常数值。

通过声明一个数组并打乱数组的内容是可能的。

#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;
}

你不能像你要求的那样"随机化开关"。此外,在您提出的问题中,每次运行程序时,用户都会输入一个数字,并显示随机结果;你甚至可以不记录他们的输入是什么,而是在随机值上记录switch

然而,我怀疑你想做的是让球员有多次机会选择门。在这种情况下,您需要创建一个door结果集合(在您的示例中,是一个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];