2014-03-05 31 views
1

所以我想测试一些东西,看看rand()如何在C++中工作!我对C++非常陌生,但我想知道如何在生成数字1或2时获得以下代码以打印出字母B或A?代码询问他是否想要生成一封信,输入y代表是或否代表否!然后生成一个字母,但它似乎只生成字母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"); 
    } 
+0

提示:在许多本地和平台上,'B'=='A'+ 1。 –

+1

@ThomasMatthews,是不是在_all_ locales和平台上?我手边没有这个标准,但我认为它实际上保证了通过“Z”的“A”具有连续的字符代码。 – CompuChip

回答

2

更改此:

如果(randNum == 1){

+0

+1 ...和'(x ='y')''也是。 '=='用于平等测试,'='用于赋值。 –

+2

很多C++程序员都会因为这个原因而将它们的if语句写成if(1 == randNum):如果你忘记了double == ==那么你会得到一个编译器错误,而不是一个意外的错误,但是正确的结果。 – CompuChip

0

在现代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; 
} 
0

当你说:

if(randNum = 1) 

分配数值1至randNum,然后检查它是否True。在C/C++中,任何非零数字是True。通过这种方式,您总是输入if声明的第一部分并获得'A'。

相反,如果你说:

if(randNum == 1) 

你是比较randNum1,并会得到你想要的行为。

0

有一个更简单的方法来生成随机字符。字符可以从ASCII码号被创建,因为我们从大写字母A知道小写Z是在65-122(谷歌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; 

作为边注,性病:: uniform_int_distribution DIST(65 ,122)是包容性的,所以它包括65和122.