4

如果您查看 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吗?

4

1 回答 1

2

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

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

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

于 2013-07-19T08:17:30.140 回答