如果你查看 C++11 中随机洗牌的规范,就会发现有 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
需要一个随机数发生器 (or engine用标准语言来说),而不是随机数分布。不同的随机数生成器即使具有理论上均匀的分布,也具有不同的特性。
-
Random or 伪随机- 真正的随机数生成器使用某种外部熵源。伪随机生成器 (PRNG) 是严格确定性的。
-
表现- 一些发电机比其他发电机更快。
-
内存使用情况- 一些 PRNG 需要比其他 PRNG 更多的内存来存储其状态。
-
经期长度- 所有 PRNG 都有一个有限的周期,之后它们开始从头开始重复相同的序列。有些人的周期比其他人长得多。
-
随机性质量- 有多次测试 http://en.wikipedia.org/wiki/Randomness_test用于测量伪随机流中是否存在微妙(或不那么微妙!)的模式。例如,参见顽固测试 http://en.wikipedia.org/wiki/Diehard_tests.
- 流是否是加密安全 http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator或不。 AFAIK,没有一个标准的 PRNG 是这样的。
有关标准提供的不同生成器的概述,请参阅http://en.cppreference.com/w/cpp/numeric/random http://en.cppreference.com/w/cpp/numeric/random.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)