无符号字符上的随机数一直是'?'

时间:2012-04-04 17:05:14

标签: c++ random unsigned-char

我之前曾问过一个与生成随机无符号字符相关的问题,但是由于我应用的简单性,所以提出了很好的建议。 srand((unsigned)time(NULL)); rand()%256;

我在程序开始时给srand打了一次电话,但是我一直在'?'对于一个随机的char。不是所有的时间,而是大多数时间,这使我失去了我的注意力。

5 个答案:

答案 0 :(得分:9)

很可能你不断获得终端不需要如何打印和输出?的随机字符。在打印前尝试将它们转换为int

std::cout << (int)my_random_char;

答案 1 :(得分:5)

你没得到'?'作为一个字符,它正在以这种方式打印,因为所选字符不可打印。将其打印为整数,您将看到该值是随机的。

答案 2 :(得分:3)

根据您的平台,值[128 255]可能不是有效字符。如果你想要一个随机的,可打印的ascii字符,那么你需要生成[32 127]范围内的字符。

这是根据我对你的另一个问题的回答修改的代码,只选择可打印的ascii字符。

int main() {
    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    auto rand = std::bind(std::uniform_int_distribution<char>(' ','~'),
                          std::mt19937(seed));

    std::generate_n(std::ostream_iterator<char>(std::cout," "), 25, rand);
}

答案 3 :(得分:1)

需要考虑的一些事项:

  1. 在每次调用srand()之前不要致电rand()。程序启动时调用一次(如果你真的想)。
  2. 尝试将无符号字符输出为整数,以查看会发生什么。

答案 4 :(得分:1)

无符号字符不是字符;他们是字节。你得到0到25​​5(含)之间的随机字节,其中一些(或大多数,取决于编码)不是有效字符。

例如,如果您想要a和z之间的随机字符,请使用类似

的内容
unsigned char c = 'a' + rand() % 26;

rand() % 26不是推荐的做法,但对大多数应用程序来说都是如此。请参阅联机帮助页。)