Ali*_*Ali 4 c++ random unsigned-char
我想知道如何生成随机的无符号字符值。我的点子;
rand()%255;
因为无符号字符支持在 0-255 之间。我想知道这种方法是否可以改进(或者这是最合法的方法)
更快会变得简单
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)
或类似的东西。
如果你想坚持标准库,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 可能会提供它。