我之前问过一个与生成随机无符号字符相关的问题,并且沿途提出了很好的建议,但是由于我应用的简单性;
srand((unsigned)time(NULL));
rand()%256;
我在程序开始时调用了 srand 一次,但是我不断收到“?” 对于随机字符。不是所有时间,而是大部分时间,这让我失去了注意力。
我之前问过一个与生成随机无符号字符相关的问题,并且沿途提出了很好的建议,但是由于我应用的简单性;
srand((unsigned)time(NULL));
rand()%256;
我在程序开始时调用了 srand 一次,但是我不断收到“?” 对于随机字符。不是所有时间,而是大部分时间,这让我失去了注意力。
很可能您不断获得终端不需要的随机字符如何打印和输出?
。尝试int
在打印前将它们转换为:
std::cout << (int)my_random_char;
你没有得到'?作为一个字符,它以这种方式打印,因为所选字符不可打印。将其打印为整数,您将看到该值是您所期望的随机值。
根据您的平台,值 [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);
}
有几点需要考虑:
srand()
在每次调用rand()
. 当你的程序启动时调用一次(如果你真的想的话)。无符号字符不是字符;它们是字节。您将获得 0 到 255(含)之间的随机字节,其中一些(或大多数,取决于编码)不是有效字符。
例如,如果您想要 a 和 z 之间的随机字符,请使用类似
unsigned char c = 'a' + rand() % 26;
(rand() % 26
不推荐这样做,但对于大多数应用程序来说已经足够了。请参阅手册页。)