c – std :: shuffle的使用和实用程序?

如果你看一下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采用随机数生成器(或标准发言引擎),而不是随机数分布.不同的随机数发生器即使具有理论上均匀的分布也具有不同的特性.

>随机或伪随机 – 真随机数发生器使用某种外部熵源.伪随机生成器(PRNG)是严格确定的.
>性能 – 一些发电机比其他发电机更快.
>内存使用 – 一些PRNG需要更多内存来存储其状态.
>周期长度 – 所有PRNG都有一个有限的周期,之后他们从头开始重复相同的序列.有些人比其他人有更长的时间.
>随机性质量 – 有numerous tests用于测量pseurorandom流中是否存在细微(或不那么微妙!)模式.例如,参见Diehard tests.
>流是否为cryptographically secure. AFAIK,没有标准的PRNG.

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

点赞