1

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

我在程序开始时调用了 srand 一次,但是我不断收到“?” 对于随机字符。不是所有时间,而是大部分时间,这让我失去了注意力。

4

5 回答 5

9

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

std::cout << (int)my_random_char;
于 2012-04-04T17:08:58.997 回答
5

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

于 2012-04-04T17:09:46.063 回答
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);
}
于 2012-04-04T17:09:43.237 回答
1

有几点需要考虑:

  1. 不要srand()在每次调用rand(). 当你的程序启动时调用一次(如果你真的想的话)。
  2. 尝试将无符号字符输出为整数,看看会发生什么。
于 2012-04-04T17:09:52.190 回答
1

无符号字符不是字符;它们是字节。您将获得 0 到 255(含)之间的随机字节,其中一些(或大多数,取决于编码)不是有效字符。

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

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

rand() % 26不推荐这样做,但对于大多数应用程序来说已经足够了。请参阅手册页。)

于 2012-04-04T17:11:23.427 回答