在C++中生成随机无符号字符值
Generating random unsigned char values in C++
我想知道如何生成随机无符号字符值。我的想法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所述,在这里,你只调用一次单词的随机位。单词大小取决于您使用的随机数生成器。
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中