如何随机化开关
How to randomize a switch?
这就是我目前所拥有的。这个项目的重点是,如果有人输入数字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];
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- Gecode 与 Z3 用于约束随机化
- 如何使用兰德随机化模拟点击
- 如何在循环中随机化不同的值?c ++
- 如何随机化双精度/浮点数据类型? C++
- 如何随机化程序的窗口标题?
- 随机化超大文件内容排序的有效方法是什么?
- 随机化问题
- 随机化种子值C
- 随机化字符数组以显示随机密码
- 如何随机化开关
- 编译时随机化结构成员的顺序
- 在C++中随机化地图
- 再次随机化的问题
- 随机数函数未正确随机化 (C++)
- 如何随机化数组
- 随机化快速排序
- C++随机化和循环困难
- 如何随机化这些数字
- 随机化不会在 while 循环中发生。如何解决这个问题?C++