C++ 无符号字符上的随机数一直为“?”

C++ 无符号字符上的随机数一直为“?”,c++,random,unsigned-char,C++,Random,Unsigned Char,我以前问过一个与生成随机无符号字符相关的问题,在这个过程中得到了很好的建议,但是由于我应用的简单性; srandunsignedtimeNULL; 兰特%256; 我在程序开始时调用了srand一次,但是对于一个随机字符,我总是得到“?”。不是所有的时间,而是大部分时间,这会使我失去注意力。很可能你一直得到随机字符,你的终端不需要如何打印和输出?。打印前尝试将其转换为int: std::cout << (int)my_random_char; 最有可能的情况是,您的终端不需要如何

我以前问过一个与生成随机无符号字符相关的问题,在这个过程中得到了很好的建议,但是由于我应用的简单性; srandunsignedtimeNULL; 兰特%256;


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

很可能你一直得到随机字符,你的终端不需要如何打印和输出?。打印前尝试将其转换为int:

std::cout << (int)my_random_char;

最有可能的情况是,您的终端不需要如何打印和输出随机字符?。打印前尝试将其转换为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);
}

根据您的平台,值[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);
}

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

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

需要考虑以下几点:

不要在每次调用rand之前调用srand。如果您真的愿意,请在程序启动时调用它一次。 尝试将无符号字符作为整数输出,看看会发生什么。
需要考虑的几件事:

不要在每次调用rand之前调用srand。如果您真的愿意,请在程序启动时调用它一次。 尝试将无符号字符作为整数输出,看看会发生什么。
无符号字符不是字符;它们是字节。您得到的是0到255(含0到255)之间的随机字节,其中一些或大部分(取决于编码)是无效字符

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);
}
例如,如果您想要一个介于a和z之间的随机字符,请使用

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

rand%26不是推荐的执行此操作的方法,但对于大多数应用程序来说已经足够了。请参阅手册页。

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

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);
}
例如,如果您想要一个介于a和z之间的随机字符,请使用

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

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

您是否检查数字值,并确定它实际上是?ASCII值63?或者只是打印字符?如果是,则可能会将任何非ASCII值(如范围128-255)打印为?。请尝试转换在打印之前,请先将其设置为int。请描述您观察到的使您认为随机字符得到“?”。更好的是,请提供一个简短、完整的测试程序。请参阅。您是否检查数值,并确定它实际上是?ASCII值63?或者您只是打印字符?如果是,则可能有任何错误非ASCII值(如范围128-255)打印为?。请在打印前尝试将其转换为int。请描述您观察到的使您认为随机字符得到“?”的情况。更好的是,请提供一个简短完整的测试程序。请参阅。非常感谢,这解决了我的问题。我目前正在Mac上工作,该字符可以吗在一个Ubuntu终端上?@ RoalBiStup:有些可能不是。它取决于终端的配置,字符集…如果你在生成随机数,你应该打印数字而不是字符,这就是转换成int的方法。如果你想要的是真正的字符,那么只考虑PRINE。表子集。非常感谢,这解决了我的问题。我目前正在Mac上工作。字符会显示在Ubuntu终端上吗?@rolandbishop:有些可能会,有些可能不会。这取决于终端的配置,字符集……如果你生成的是随机数,你应该打印数字而不是字符,反之亦然如果你想要的是真正的字符,那么考虑只使用可打印的子集。哦,是的……像其他人指出的那样去寻找整数。看起来大多数时候你得到的值都在ASCII范围之外,在终端上表示为‘?’。我以前没见过,我见过
用“立场”代替“立场”。编辑:哦,是的。。。正如其他人所指出的那样,去寻找整数。似乎大多数时候,您得到的值都超出了ascii范围,在终端上表示为“?”。PS:您在编辑权限中添加了该值?我可以发誓我以前从未见过它。我写的是“站”而不是“站”。编辑that@rolandbishop注意C++不保证任何字符值范围是可打印的,但是32-127几乎可以在几乎所有的事情上工作。是的,可能实现可能不是ASCII兼容的。尽管这些都是异类系统,但是RoalbBiopp:注意C++不能保证任何字符值的范围是可打印的,但是32-127几乎可以在所有的事情上工作。是的,可能的实现可能不是ASCII兼容的。尽管现在一切都是如此,除了奇异的系统。