如何随机化一个开关?

时间:2017-11-08 01:59:02

标签: c++ function switch-statement

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

5 个答案:

答案 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];