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

Generating random unsigned char values in C++

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

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

简单的会更快

unsigned char a = (unsigned char) rand();

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

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;

或者类似的东西。

如果你想坚持使用标准库,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);
}

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

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

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


一些额外的资源。

使用随机库的C++方法中,一种稍微干净一点的方法是:

#include <random>
int myseed = 1234;
std::default_random_engine rng(myseed);
std::uniform_int_distribution<int> rng_dist(0, 255);
char mychar = static_cast<unsigned char>(rng_dist(rng));

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

您应该知道,就其输出的质量(随机性)而言,rand()是广泛可用的随机数生成器中最差的一个。在基于UNIX的系统和其他一些系统上,random()lrand48()[以及朋友]的性能要好得多。为了提高速度,最好的使用方法是如上@Pida所述,在这里,你只调用一次单词的随机位。单词大小取决于您使用的随机数生成器。