在 C++ 中生成随机的无符号字符值

Ali*_*Ali 4 c++ random unsigned-char

我想知道如何生成随机的无符号字符值。我的点子;
rand()%255;因为无符号字符支持在 0-255 之间。我想知道这种方法是否可以改进(或者这是最合法的方法)

Pet*_*ský 6

更快会变得简单

unsigned char a = (unsigned char) rand();
Run Code Online (Sandbox Code Playgroud)

或者,您甚至可以将生成的整数(在 32 位架构上)进行 4 次移位,以减少对以下调用的四次rand()

int a = rand();
unsigned char r1 = (unsigned char) a;
unsigned char r2 = (unsigned char) a >> 8;
unsigned char r3 = (unsigned char) a >> 16;
unsigned char r4 = (unsigned char) a >> 24;
Run Code Online (Sandbox Code Playgroud)

或类似的东西。

  • 在“RAND_MAX”小于“INT_MAX”的平台上(例如,VC++,其中“RAND_MAX”为“32767”),高位字节将始终为“0”。 (8认同)

bam*_*s53 5

如果你想坚持标准库,C++11 随机数库是最好的方法:

#include <random>

#include <functional>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <climits>

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<>(0, UCHAR_MAX),
                          std::mt19937(seed));

    std::generate_n(std::ostream_iterator<int>(std::cout," "), 25, rand);
}
Run Code Online (Sandbox Code Playgroud)

该库提供了一些统一的随机数引擎和适配器,与它们一起使用以生成各种发行版。这里我们使用一个mt19937引擎(种子使用random_device(如果可能的话作为非确定性数据的来源),seed_seq并将足够多的随机数据组合成适合填写 mt19937 内部状态的形式。然后我们mt19937使用 a 进行调整uniform_int_distribution。默认情况下,此分布将生成在其模板参数支持的范围内均匀分布的数字,在本例中为unsigned char。因此,我们创建的函数对象将生成范围 [0 256) 内的值。通过将 25 个值写入标准输出来证明其结果。

还有其他用途的分布,例如生成正态分布、模拟硬币翻转或从具有任意权重的集合中挑选项目(例如,从 3 个项目中挑选一个,其中第一个被选中 50% 的时间,第二个被选中 10 % 的时间,第三,40% 的时间)。

其他发动机提供不同的质量和性能特征。例如,如果您需要一个加密随机数生成器,如果您的实现提供这样的功能, random_device 可能会提供它。


一些额外的资源

  • `uniform_int_distribution&lt;unsigned char&gt;` 在 Visual C++ 2013 中给出了编译时错误,所以这个想法看起来不像是可移植的。 (2认同)

Joh*_*136 1

你可以使用unsigned char n = (unsigned char)(rand() & 0x00ff);