【问题标题】:How can i get my code to print a character or string randomly?如何让我的代码随机打印一个字符或字符串?
【发布时间】:2014-04-08 05:12:29
【问题描述】:

所以我正在尝试测试一些东西,看看 rand() 在 C++ 中是如何工作的!我对 c++ 很陌生,但我想知道如何在生成数字 1 或 2 时获得以下代码以打印出字母 B 或 A?代码询问他是否要生成一个字母,输入 y 表示是或 n 表示否!然后生成一个字母,但它似乎只生成字母 A??有什么想法吗?

    #include <iostream>
    #include <ctime>
    #include <cstdlib>

    using namespace std;

    int main(){
        char x;
        char d;
        cout << "generate random letter?(y/n)" << endl;
        cin >> x;
        if (x = 'y'){
    srand(time(NULL));

    int randNum = (rand() % 2) + 1;
    if (randNum = 1){
        d = 'A';
    }
    else {
        d = 'B';
    }
    cout << d << endl;
}
else{ return 0; }
system("pause");
    }

【问题讨论】:

  • 提示:在许多本地和平台上,'B' == 'A' + 1。
  • @ThomasMatthews,不是在 所有 语言环境和平台上吗?我手头没有标准,但我认为实际上可以保证'A''Z' 具有连续的字符代码。

标签: c++ string random numbers percentage


【解决方案1】:

改变这个:

如果 (randNum == 1){

【讨论】:

  • +1... 和(x = 'y') 也是。 == 用于相等测试,= 用于分配。
  • 很多 C++ 程序员将他们的 if 语句写成 if(1 == randNum) 正是因为这个原因:如果你忘记了双 == 你会得到一个编译器错误而不是意外但正确结果。
【解决方案2】:

在现代 C++、rand() is deprecated 和其他基于例如使用mt19937 Mersenne twister 引擎和uniform_int_distrubtion

您可能需要考虑以下代码:

#include <iostream>     // For console output
#include <random>       // For pseudo-random number generators and distributions

int main()
{
    // Use random_device to generate a seed for Mersenne twister engine.
    std::random_device rd;    

    // Use Mersenne twister engine to generate pseudo-random numbers.
    std::mt19937 engine(rd());

    // "Filter" MT engine's output to generate pseudo-random integer values,
    // **uniformly distributed** on the closed interval [0, 1].  
    // (Note that the range is [inclusive, inclusive].)
    std::uniform_int_distribution<int> dist(0, 1);

    // Print 20 pseudo-random letters (A, B).
    for (int i = 0; i < 20; ++i)
    {
        // Generate pseudo-random number
        if (dist(engine) == 0)
        {
            std::cout << 'A';
        }
        else 
        {
            std::cout << 'B';
        }
        std::cout << ' ';
    }
    std::cout << std::endl;
}

【讨论】:

    【解决方案3】:

    当你说:

    if(randNum = 1)
    

    您将值 1 分配给 randNum,然后检查它是否为 True。在 C/C++ 中,任何非零数都是 True。这样,您始终输入if 语句的第一部分并获得“A”。

    如果你说:

    if(randNum == 1)
    

    您将randNum1 进行比较,将得到您想要的行为。

    【讨论】:

      【解决方案4】:

      有一种更简单的方法可以生成随机字符。字符可以从 ASCII 码数创建,因为我们知道从大写 A 到小写 Z 的范围是 65-122(google ASCII 表)

      std::random_device rd;
      std::mt19937 engine(rd());
      std::uniform_int_distribution<int> dist(65, 122);
      char ascii_char = dist(engine);
      std::cout << scii_char;
      

      附带说明,std::uniform_int_distribution dist(65, 122) 是包容性的,因此它包括 65 和 122。

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 2021-10-25
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多