2

嗨,我正在为我的 c++ 课程的期末考试做一个刽子手项目。我已经完成了大部分工作,但我想做到这一点,以便玩家可以选择在单人模式下与电脑对手对战。我尝试执行类似 97+rand()%123 之类的操作,然后将数字转换为字符,但我不断收到奇怪的字符,例如倒置 f 我检查了是否遗漏了某些内容,但我有正确的指令,并且包含了一个 srand . 我所做的简化版本看起来像这样

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;

int main(){
    char cch;
    char ch; 
    unsigned seed= time(0)
    srand(seed)
    cch=97rand()%123;
    ch=cch;
    cout<<"computer chose "<< ch<<endl;
}

请注意,我没有包括我的项目的所有内容

4

5 回答 5

14

利用

cch = 'a' + rand()%26;

这将为“a”添加一个随机数(在 int 中等于 97,但使用该数字会使您的代码可读性降低),请记住,'a' == 97因为 C 和 C++ 实际上并不关心您的数据类型。

所以如果它被存储为 char 将被视为 char

于 2013-11-21T21:55:54.310 回答
6

您可能会发现用您想要选择的所有有效字符定义一个 char 数组更容易,然后在 0 和存储在数组中的字符数之间选择一个随机字符;

char letters[] = "abcdefghijklmnopqrstuvwxyz";
char x = letters[rand() % 26];

它可能效率不高,但它使您的意图更加清晰。

此外,如果您需要更频繁地修改某些字符出现的概率,您可以通过多次添加相同的字符来实现。

于 2013-11-21T22:45:39.997 回答
4

查看ASCII表并注意有效字符介于 97 到 122 和 65 到 90 之间。我认为您需要小写字母。您可以像这样选择一个随机的小写字母:

char x = 97 + rand() % 26;
于 2013-11-21T21:57:16.847 回答
2

您不希望计算机一遍又一遍地猜测相同的字母。

#include <random>
#include <iterator>
#include <iostream>
#include <algorithm>

int main() {
  char letters[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
                     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
                     's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

  std::random_device r;
  std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
  std::shuffle(std::begin(letters), std::end(letters),
               std::mt19937(seed));

  for (char c : letters) {
    std::cout << "Computer chose: " << c << '\n';
  }
}
于 2013-11-21T22:47:52.180 回答
0

公式应该是:cch = 97 + rand()%26;

于 2013-11-21T21:51:17.087 回答