洗牌算法和随机数生成

来源:互联网 发布:移动硬盘不能写入 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)。

0 0
原创粉丝点击