C++ -- shuffle 和 random_shuffle 随机打乱
来源:互联网 发布:手游变速软件 编辑:程序博客网 时间:2024/05/19 00:14
本系列文章的目录在这里:目录. 通过目录里可以对STL总体有个大概了解
前言
本文介绍了STL中的变序类算法(mutating algorithm)里面的洗牌算法:std::random_shuffle和std::shuffle.
random_shuffle算法在C++11之前就已经存在,C++11之后由于右值引用的引入,它的使用范围变大了。
shuffle算法则是从C++11之后才开始出现,可以与随机数和分布库一起使用。
与本系列的其他文章一样,本文介绍该最新的使用方法,比如random_shuffle在C++11以后接收的第三个参数从左值引用改成了右值引用,使得能够传入临时对象和函数,也就是说其使用范围括大了。
shuffle的三种形式
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
shuffle是从C++11开始支持的,作用是使用一个随机数引擎来打乱[first, last)之间元素的顺序,关于随机数引擎需要参考<random>
头文件及相关资料.
random_shuffle有两种形式:
第一种,使用默认的随机数生成器(比如C语言中的rand())来打乱[first, last)之间的元素顺序。默认随机数生成器和具体的编译器实现有关。
第二种,使用指定的随机器生成函数gen来打乱[first, last)之间元素的顺序。gen接受一个difference_type类型的参数n,返回一个随机数x,x的范围在[0, n)之间.
其等价的实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
基本用法
如果不需要特殊的处理需求,那么使用默认的随机数生成器就能简单实现的随机洗牌效果,下面给出代码示例:
使用默认的随机数生成器来shuffle
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
输出:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
其中对于default_random_engine的使用,还可以指定种子seed,比如:
- 1
- 2
- 3
- 1
- 2
- 3
更多的关于random engine的内容请参考<random>
中的介绍。
基本的用法已经能满足一些对随机性要求不高的场合,对于上面默认随机数生成器只需知道,rand()和默认的随机生成器产生的随机数是服从均匀分布的(uniform distribution), 又叫做矩形分布,每个元素的概率是1/(max - min).
使用自定义的generator来shuffle元素
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
某次执行的输出:
- 1
- 2
- 1
- 2
《C++ 标准库》的作者说使用自定义的generator比直接调用rand()要好,自定义的generator是一个对象,它内部封装了自己的状态,不会像rand()那样使用一个静态变量保存其状态,rand()这样“天生就不是线程安全的,无法同时有两个独立互不干扰的随机数流”.
shuffle的时间复杂度
因为算法内部进行n - 1次交换,所以时间复杂度为O(n).
源码和参考链接
shuffle_random_shuffle_test.cpp
shuffle
random_shuffle
<random>
作者水平有限,对相关知识的理解和总结难免有错误,还望给予指正,非常感谢!
欢迎访问github博客,与本站同步更新
- C++ -- shuffle 和 random_shuffle 随机打乱
- python random.shuffle(随机打乱列表等) 和 random.random
- stl——shuffle / random_shuffle 生成随机序列
- random_shuffle()打乱顺序
- Sort and Shuffle 排序和打乱
- 用Collection.shuffle()随机打乱一个顺序数组
- 用Collection.shuffle()随机打乱一个顺序数组
- shuffle:随机打乱一个数组的顺序的另一种方法
- 随机打乱和逆过程
- C++ shuffle,random_shuffle
- random_shuffle(stl算法)打乱顺序
- javascript shuffle 打乱数组
- random_shuffle (stl算法)打乱顺序
- 随机打乱/随机发牌
- 使用Collections类中shuffle随机打乱List内部元素顺序
- 【C++ STL应用与实现】64: 如何使用shuffle和random_shuffle : 洗牌 (since C++11)
- 将数组打乱 shuffle 函数
- shuffle函数打乱(images, labels)
- HTTP协议请求方法简述及get和post方法区别
- C#与C++数据类型比较及结构体转换
- mvc mvvm mvp
- 软件测试常考题
- linux系统vi命令大全
- C++ -- shuffle 和 random_shuffle 随机打乱
- 网络编程_Socket通信原理图解
- class文件魔数CAFEBABE的由来
- 链表中倒数第 K 个结点-反转链表
- Qt--01:基础知识
- REST设计风格
- HtmlPaser英文文档与Http英文文档
- php1
- CharSequence 去除两端空格