无符号字符上的随机数不断被'?'
Random numbers on unsigned chars keeps being '?'
我之前问过一个关于生成随机无符号字符的问题,但由于我应用的简单性,我提出了一些很好的建议;
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);
}
需要考虑的几件事:
- 不要在每次调用
rand()
之前调用srand()
。当你的程序启动时(如果你真的想的话),请叫它一次 - 尝试将无符号字符输出为整数,看看会发生什么
无符号字符不是字符;它们是字节。您得到的是0到255(包括0和255)之间的随机字节,其中一些(或大部分,取决于编码)是无效字符。
例如,如果你想要一个介于a和z之间的随机字符,可以使用类似的东西
unsigned char c = 'a' + rand() % 26;
(rand() % 26
不是推荐的方法,但它对大多数应用程序来说已经足够好了。请参阅手册页。)
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 整数不会重复超过随机数
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何将升压随机数生成器的状态存储为常量字符 *
- 流 C/C++ 中的随机数、符号、字符
- 无符号字符上的随机数不断被'?'
- 随机数(rand)不能输出未知字符