4

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

4

5 回答 5

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 可能会提供它。


一些额外的资源

于 2012-04-04T02:02:28.337 回答
5

快很多会很简单

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;

或类似的东西。

于 2012-04-04T00:04:24.913 回答
2

使用随机库以 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));
于 2013-06-13T23:39:54.700 回答
1

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

于 2012-04-03T23:58:50.800 回答
0

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

于 2012-04-04T01:36:16.003 回答