洗牌算法和随机数生成
来源:互联网 发布:移动硬盘不能写入 mac 编辑:程序博客网 时间:2024/05/16 23:49
【题目】
要求输入一组数据,输出的结果为这组数据的随机排列。
【解题思路】
1. 调用头文件algorithms中的random_shuffle函数。该函数的本质就是生成随机位置,不断交换,使得数据重新排列。
2. 产生随机数,结合swap函数实现数组的重新排列。
【代码】
#include <iostream>#include <vector>#include <algorithm>#include <time.h>#include <stdlib.h>using namespace std;vector<int> shuffle(vector<int> &A){ int n = A.size(); vector<int> res(A); for (int i = n-1; i>= 0; --i) { srand((unsigned int)time(NULL)); int loc = rand()%(i+1); if (loc != i) { swap(res[i], res[loc]); } } return res;}int main(){ int n = 10; vector<int> A; for (int i = 0; i < n; ++i) A.push_back(i); vector<int> A1(A); cout << "origin" << endl; for (int i = 0; i < n; ++i) cout << A[i] << " "; for (int i = 0; i < 3; ++i) { //通过生成随机位置并交换实现洗牌 cout << "\nshuffle" << endl; vector<int> res = shuffle(A); for (int i = 0; i < n; ++i) cout << res[i] << " "; //调用random_shuffle()函数实现洗牌 cout << "\nrandom_shuffle" << endl; random_shuffle(A1.begin(), A1.end()); for (int i = 0; i < n; ++i) cout << A1[i] << " "; } return 0;}
【随机数生成函数】
1. rand()
rand()为随机数发生器,包含在头文件stdlib.h中,可以产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是以一个数(可以称为种子)为基准,以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。
用户未设定随机数种子时,系统默认的随机数种子为1。
rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。
2. srand()
srand()为初始化随机数发生器,包含在头文件stdlib.h中,使用时参数为种子(无符号整数),用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
使用当前时钟作为随机数种子,因为每一次运行程序的时间是不同的,因此可以产生不同的随机数种子,进而得到不同的随机数。具体用法为srand((unsigned int) time(NULL))。
如果不使用srand()初始化随机数发生器,程序运行两次得到的结果如下:
使用srand()初始化随机数发生器后,程序运行两次得到的结果如下:
产生一定范围随机数的通用表示公式
要取得[a,b)的随机整数,使用(rand()% (b-a))+ a;
要取得[a,b]的随机整数,使用(rand()% (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand()% (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。- 洗牌算法和随机数生成
- 不用随机数的洗牌算法
- 也谈生成不重复的随机数系列(洗牌算法)
- 洗牌和发牌算法
- 随机数(洗牌)
- 数组生成和数组洗牌
- 由洗牌想到的不重复随机数的生成
- 随机数生成算法
- 伪随机数生成算法
- 随机数生成算法
- 一种随机数生成算法
- 随机数生成算法
- java随机数生成算法
- 随机数生成算法
- 随机数生成算法
- 随机数生成算法
- 算法---随机数生成
- 随机数生成算法
- java/c# 判断点是否在多边形区域内
- 通讯录(一) —————— 静态实现
- 复习布局基础
- NS3 - queue-discs-benchmark.cc - traffic-control-module.h - flow-monitor-module.h
- 数组中添加对象
- 洗牌算法和随机数生成
- 配置React的Babel 6和Webpack 2环境
- 高手之路——Po学校学习笔记-第五课
- Linux-破解rhel7-root密码
- 数据库函数依赖和范式理论学习总结
- Ubuntu使用问题&解决笔记
- UMASK详解
- Codeforces Problem 711D Directed Roads(Tarjan判环)
- (转)23种设计模式