【问题标题】:Why Aren't `std::uniform_int_distribution<uint8_t>` and `std::uniform_int_distribution<int8_t>` Allowed?为什么不允许`std::uniform_int_distribution<uint8_t>`和`std::uniform_int_distribution<int8_t>`?
【发布时间】:2015-10-06 06:49:06
【问题描述】:

作为documentation says

如果这不是shortintlonglong longunsigned shortunsigned intunsigned longunsigned long long 之一,则效果未定义。

如果我不关心范围,我可以屏蔽较大类型的位以生成随机数。如果不是,那就更复杂了。为什么不默认提供字节类型?

【问题讨论】:

  • 难道不是int8_t——如果实现提供了它——一定是列出的整数之一的typedef
  • @5gon12eder 很可能是已签名的字符,该列表中确实缺少该字符。
  • @ShafikYaghmour 啊,谢谢。现在我明白了这一点并理解了你的答案。我没有注意到它不见了。
  • 您还可以使用uniform_int_distribution&lt;int&gt; d{0, std::numeric_limits&lt;uint8_t&gt;::max()} 来获得适合uint8_t 的均匀分布值

标签: c++ c++11 random


【解决方案1】:

关于这个uniform_int_distribution<unsigned char> should be permitted 有一个图书馆工作组未解决[1] 问题,它说,除其他外:

我不知道&lt;random&gt; 中有任何适用于 16 位的内容 整数,但使用 8 位整数失败,所以我怀疑 IntTypeUIntType 可以简单地扩展以允许 char 系列。 或者,此更改可能仅限于 单独使用uniform_int_distribution,它绝对是安全的。一种 &lt;random&gt; 专家应该决定哪种更改最好。

建议的解决方案是更改限制以允许标准整数类型:

具有名为IntType 的模板类型参数是未定义的,除非 对应的模板参数是 cv-unqualified 并且是 a 标准整数类型(3.9.1 [basic.fundamental]

和:

具有名为UIntType 的模板类型参数未定义 除非相应的模板参数是 cv-unqualified 并且是 标准无符号整数类型(3.9.1 [basic.fundamental])

这会让你得到 unsigned / signed char 虽然不是 uint8_tint8_t 但它们可能是等价的。排除了扩展的整数类型以简化措辞并最大限度地达成共识:

这也排除了扩展的整数类型和宽字符类型,它们充其量只是看起来不错。我不反对支持任何这些类型;我只是选择这个来简化措辞并希望最大限度地达成共识。

注意,这不包括 char,因为它是由实现定义的 char 是否已签名。

请注意,std-discussion list 中也提出了此主题。

Jonathan Wakely 指出该提案存在争议,并评论说他在上次讨论中的笔记包括以下内容:

不支持单字节整数绝对是故意的,不是意外遗漏,所以我们应该小心在没有咨询 C++11 设计者的情况下更改它

他建议在random_device 中添加一个成员以提供单个字节,这似乎是一个合理的选择。


[1] 该问题已作为“Not A Defect”关闭,这意味着它不会作为缺陷报告解决。相反,需要一份正式的变更提案。

【讨论】:

  • 提议的更改颇具争议。我建议,如果真正想要的是随机字节的来源(这似乎是人们在要求这个时真正想要的),那么获取 N 个随机字节的替代接口会比让每个发行版都支持 1 字节整数更好.
  • 我上次讨论的笔记说,不支持单字节整数绝对是故意的,不是意外遗漏,所以我们应该小心不要在没有咨询设计者的情况下更改它C++11 &lt;random&gt; 设施。我的建议是向random_device 添加一个成员函数来获取随机字节,而不是触及任何引擎或发行版。这可能比从分发中一次提取一个字节的性能要好得多。
  • 仅供参考:LWG 问题 2326,认为 IntType 中缺少 signed/unsigned char 类型是有缺陷的 closed as "Not A Defect" 这并不是说它不会被修复。这只是说当前行为是设计使然,因此更改应该是正式的提议,而不是缺陷修复。
  • @JonathanWakely 您的笔记是否说明了为什么委员会最初有意排除字符类型?
  • 这些都不能解释为什么在地球上我不能生成,比如说,骰子以可以保存这些值的最小标准整数类型从 1 滚动到 6。这看起来很像疏忽,在冗长的回答和讨论中没有提到任何理由。 “整数不是字符”是一个糟糕的论点。
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多