当前位置: 首页 > 知识库问答 >
问题:

无法使用independent_bits_engine随机化字节

欧阳向文
2023-03-14

我试图随机化一个字节数组,但它不允许我编译它,因为下面的错误。它甚至不适用于byte而不是std::uint8_t

错误C2338:independent_bits_engine的无效模板参数:N465929.6.1.1[rand.req.genl]/1f需要un有符号短、无符号int、无符号长或无符号长

消息:请参阅类模板实例化的d::independent_bits_engine

错误C2338:注意:不允许使用字符、有符号字符、无符号字符、字符8_

template<std::size_t N>
void generate_random_key(std::uint8_t(&iv_buff)[N])
{
    using random_bytes_engine = std::independent_bits_engine<std::default_random_engine, CHAR_BIT, std::uint8_t>;
    random_bytes_engine rbe;

    std::generate(std::begin(iv_buff), std::end(iv_buff), std::ref(rbe));
}

共有1个答案

经慈
2023-03-14

[rand.req.genl]/1.6 (在C 23草案中):

贯穿本小节< code>[rand],实例化模板的效果:

除非对应的模板参数是非cv限定的,并且是< code>unsigned short、< code>unsigned int、< code>unsigned long或< code>unsigned long long中的一种,否则未定义。

因此,效果是根据未定义的标准,因为您没有使用上述类型之一。

您可以使用无符号短符号来获得相同的效果:

template<std::size_t N>
void generate_random_key(std::uint8_t(&iv_buff)[N])
{
    using random_bytes_engine = std::independent_bits_engine<std::default_random_engine,
                                                             CHAR_BIT, unsigned short>;
    random_bytes_engine rbe;

    std::generate(std::begin(iv_buff), std::end(iv_buff), rbe);
}

如果您收到警告(例如“从无符号短路转换为_Ty,可能会丢失数据”),则可以将对rbe的调用包装在lambda中并执行static_cast

    std::generate(std::begin(iv_buff), std::end(iv_buff), [&rbe]() {
        return static_cast<std::uint8_t>(rbe());
    });
 类似资料:
  • 有时,计算结果不可预测会很有趣。 徽标提供随机程序以生成随机数。 它有一个参数并产生一个随机均匀选择的整数值,该值大于或等于0且小于其参数的值。 因此,如果您想要一个0到359度之间的随机角度,您可以使用命令random 360来生成它。 请记住,除非您对结果执行某些操作(例如打印),否则徽标将显示错误。 让我们看看下面的例子 - 我们发出了命令 - 在上面的命令窗口中多次print random

  • 我正在Coursera学习算法课程。其中一项任务如下: 随机队列。随机化队列类似于堆栈或队列,不同之处在于移除的项是在数据结构中的项之间统一随机选择的。 我试图找到一种方法,在固定的时间内实现出列(随机删除项目)。我想到了一个主意,就是重新要求一个deque(它支持在固定时间内从前面和后面删除和添加一个项目)。我的想法如下: 在随机化队列中使用deque作为底层数据结构 加入-使用库函数生成0到1

  • 本文向大家介绍Python常用随机数与随机字符串方法实例,包括了Python常用随机数与随机字符串方法实例的使用技巧和注意事项,需要的朋友参考一下 随机整数: 随机选取0到100间的偶数: 随机浮点数: 随机字符: 多个字符中选取特定数量的字符: 多个字符中选取特定数量的字符组成新字符串: 随机选取字符串: 洗牌: random的函数还有很多,此处不一一列举, 参考资料: http://docs.

  • 给定一个随机数生成器random(7),它可以以相等的概率生成数字1,2,3,4,5,6,7(即每个数字出现的概率为1/7)。现在我们要设计一个随机数(5),它能以相等的概率(1/5)生成1,2,3,4,5。 有一种方法:每次我们随机运行(7),只有当它生成1-5时才返回。如果是6或7,再运行一次,直到它是1-5。 我有点困惑。第一个问题是: 如何用数学方法证明每个数字发生的概率是1/5?例如,假

  • 本文向大家介绍在C#中将字符串随机化,包括了在C#中将字符串随机化的使用技巧和注意事项,需要的朋友参考一下 要随机化字符串,首先使用Random类- 现在,将方法与- 这是显示随机字符串的竞赛代码- 示例 输出结果

  • 问题内容: 我有一个像这样的数组: 如何将其随机/随机播放? 问题答案: 实际无偏混洗算法是Fisher-Yates(aka Knuth)。