【问题标题】:Use and utility of std::shuffle?std::shuffle 的用途和用途?
【发布时间】:2013-07-18 13:30:34
【问题描述】:

如果你看一下 C++11 中随机 shuffle 的规范,有 3 个函数。我的问题是:

template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );

相比:

template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );

我的意思是,似乎无论 URNG 是什么(均匀分布),结果都是一样的(从统计的角度来看)。我看到的唯一一点是std::shuffle 是安全的,而std::random_shuffle 的重载则不是。你能确认一下吗?

编辑:我认为 URNG 应该是一个统一的分布,但似乎没有编译。那么有人可以提供一个使用std::shuffle的小例子吗?

【问题讨论】:

  • 好吧,第一个让您选择随机数生成器。第二个没有。
  • 我很难相信结果是一样的。你到底是怎么打电话给std::shuffle的?
  • @Xeo,当我说“相同”时,我的意思是“在统计上相同”。
  • @Vincent,您可以将其包装到分发对象中,例如normal_distribution 实例(在此处查看更多信息 cplusplus.com/reference/random/normal_distribution
  • 你可以在cppreference找到一个std::shuffle的小例子

标签: c++ c++11 random shuffle stl-algorithm


【解决方案1】:

如 cmets 中所述,std::shuffle 采用随机数生成器(或标准的引擎),而不是随机数分布。不同的随机数生成器即使理论上分布均匀,也有不同的特性。

  • Randompseudo-random - 真正的随机数生成器使用某种外部熵源。伪随机生成器 (PRNG) 具有严格的确定性。
  • 性能 - 一些生成器比其他生成器更快。
  • 内存使用情况 - 一些 PRNG 需要比其他 PRNG 更多的内存来存储其状态。
  • 周期长度 - 所有 PRNG 都有一个有限的周期,之后它们从头开始重复相同的序列。有些人的经期比其他人长得多。
  • 随机质量 - numerous tests 用于测量伪随机流中是否存在微妙(或不那么微妙!)的模式。例如,请参阅Diehard tests
  • 流是否为cryptographically secure。 AFAIK,标准的 PRNG 都不是。

有关标准提供的不同生成器的概述,请参阅http://en.cppreference.com/w/cpp/numeric/random

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多