我想知道如何生成随机无符号字符值。我的想法;
rand()%255;
因为无符号字符支持在 0-255 之间。我想知道这种方法是否可以改进(或者它是最合法的方法)
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);
}
该库提供了一些统一的随机数引擎和适配器,以与它们一起使用以生成各种分布。这里我们使用一个mt19937
引擎(种子使用random_device
(如果可能的话,作为非确定性数据的来源),seed_seq
并将足够的随机数据组合成一个适合填写 mt19937 内部状态的表格。然后我们mt19937
使用 a 进行调整uniform_int_distribution
。默认情况下,此分布将生成在其模板参数支持的范围内均匀分布的数字,在这种情况下unsigned char
,因此我们创建的函数对象将生成范围 [0 256) 内的值。通过将 25 个值写入标准输出来演示其结果。
还有其他用途的分布,例如产生正态分布、模拟硬币翻转或从具有任意权重的集合中挑选物品(例如,挑选 3 个物品中的一个,其中第一个被挑选 50% 的时间,第二个被挑选 10 % 的时间,第三次,40% 的时间)。
为不同的质量和性能特性提供了其他引擎。例如,如果您需要一个加密随机数生成器,如果您的实现提供了这种功能,则 random_device 可能会提供它。
快很多会很简单
unsigned char a = (unsigned char) rand();
或者,您甚至可以对生成的整数进行 4 次移位(在 32 位架构上),以减少对以下的调用的四倍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;
或类似的东西。
使用随机库以 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 所述,您只调用一次以获得一个单词的随机位。字长取决于您使用的随机数生成器。