【问题标题】:How do you set up the syntax for a random number generator using cpp?如何使用 cpp 设置随机数生成器的语法?
【发布时间】:2019-07-22 22:23:14
【问题描述】:

让我先说我对编码很陌生,但喜欢学习。我想随机生成一个数字,然后跟随 700 if 语句,根据生成的数字提出问题。因此,它会从用户 pov 中随机提问,然后生成另一个数字。

我已经尝试过定时随机数生成器。我似乎无法让 rand 运营商工作。我只想要一个超级基本的生成器。

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    string a = "placeholder";
    cout << "Welcome to Basic Strategy Practice" << endl;
    cout << "You are given two aces and the dealer is showing a four. Hit, 
        double, or split ? " << endl;
        cin >> a;
    if (a == "split") {
        cout << "Correct!" << endl;
    }
    else {
        cout << "Incorrect" << endl;
    }

    return 0;
}

基本上,我会将上述代码封装在一个 if 语句中,该语句指定在每个问题被询问后生成的数字。我认为您只需将 if 语句放在某种 while 循环中即可。谢谢!

【问题讨论】:

  • 我似乎无法让 rand 运算符工作 您应该已经展示了使用随机数的代码。对于StackOverflow 及其问答格式,这将是一个更好的问题。
  • 你真的希望用户每次都输入“split”或“double”之类的吗?他们不会逗留太久!首先,通过提示“[H]it、[D]ouble 或 [S]plit”来要求输入单个字母。然后检查输入!如果这三个都不是,则返回并再次提示用户。

标签: c++ loops random


【解决方案1】:

我会这样做:

#include <random>

int RandomBetween(int p_min, int p_max)
{
    static default_random_engine generator;
    std::uniform_int_distribution<int> distribution(p_min, p_max);
    return distribution(generator);
}

之后,你可以在switch中调用这个函数:

switch(RandomBetween(a, b))
{
    ...
}

如果你想要一个完整的测验程序的例子,我做了这个:

#include <string>
#include <iostream>
#include <tuple>
#include <chrono>
#include <vector>
#include <algorithm>
#include <random>

std::string ToLower(std::string p_target)
{
    std::transform(p_target.begin(), p_target.end(), p_target.begin(), [](unsigned char c) { return std::tolower(c); });
    return p_target;
}

int RandomBetween(int p_min, int p_max)
{
    static std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(p_min, p_max);
    return distribution(generator);
}

class Question
{
public:
    Question(const std::string& p_message, const std::string& p_answer, bool p_caseSensitive) :
        m_message(p_message),
        m_answer(p_answer),
        m_caseSensitive(p_caseSensitive)
    {}

    std::tuple<bool, float> Ask() const
    {
        std::string answer;

        std::cout << m_message << std::endl;

        std::chrono::time_point<std::chrono::system_clock> start, end;
        start = std::chrono::system_clock::now();
        std::cin >> answer;
        end = std::chrono::system_clock::now();

        return { answer == m_answer || (!m_caseSensitive && ToLower(answer) == ToLower(m_answer)), std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / 1000.0f };
    }

private:
    std::string m_message;
    std::string m_answer;
    bool m_caseSensitive;
};

int main()
{
    bool gameRunning = true;
    std::vector<Question> questions;

    questions.emplace_back("Capital of France?", "Paris", false);
    questions.emplace_back("Is C++ object oriented? [Y/n]", "y", false);

    while (gameRunning)
    {
        const auto& [success, time] = questions[RandomBetween(0, 1)].Ask();

        std::string answerSpeed = "(Answered in: " + std::to_string(time) + "s)";
        if (success)
        {
            std::cout << "You are right!" << answerSpeed << std::endl;
        }
        else
        {
            std::cout << "You failed... Game is over!" << answerSpeed << std::endl;
            gameRunning = false;
        }
    }

    return 0;
}

哪个可以(因为它是随机游戏)输出:

Capital of France?
Paris
You are right!(Answered in: 1.705000s)
Capital of France?
Paris
You are right!(Answered in: 2.368000s)
Capital of France?
Paris
You are right!(Answered in: 1.657000s)
Is C++ object oriented? [Y/n]
y
You are right!(Answered in: 3.927000s)
Capital of France?
I don't know
You failed... Game is over!(Answered in: 12.921000s)

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 2014-09-20
    • 2015-03-14
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多