无符号字符上的随机数不断被'?'

Random numbers on unsigned chars keeps being '?'

本文关键字:字符 随机数 无符号      更新时间:2023-10-16

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

我在节目开始时给srand打了一次电话,但我一直在说"?"对于随机字符。不是所有的时间,但大多数时候,这会导致我失去注意力。

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

std::cout << (int)my_random_char;

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

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

这是我对另一个问题的回答中修改的代码,只选择可打印的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);
}

需要考虑的几件事:

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

无符号字符不是字符;它们是字节。您得到的是0到255(包括0和255)之间的随机字节,其中一些(或大部分,取决于编码)是无效字符。

例如,如果你想要一个介于a和z之间的随机字符,可以使用类似的东西

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

rand() % 26不是推荐的方法,但它对大多数应用程序来说已经足够好了。请参阅手册页。)