牛刀小试(02)——生成不重复的随机数

来源:互联网 发布:淘宝店网址花钱改 编辑:程序博客网 时间:2024/05/16 08:18

牛刀小试(02)——生成不重复的随机数

标签: 牛刀小试


1.题目描述

要求生成一个随机序列,要求其中的数不能重复。

2.思路解析

C/C++提供了生成随机数的函数rand(),不过有两个问题

  • 该函数生成的是伪随机数
  • 该函数生成的随机数有可能重复

之所以是伪随机数,是因为rand()是根据一个初始值来计算“随机数”的,如果初始值一样,则生成的“随机序列”也是一样的,所以可以通过设定随机种子来生成“真-随机数”

至于随机数不能重复,我们可以生成一个不重复的序列,假设数组a[n]满足该条件,先从下标[1,n-1]中随机取一个下标j,让a[0]a[j]交换;然后再从下标[2,n-1]中随机取一个下标j,让a[1]a[j]交换;……;然后再从下标[i+1,n-1]中随机取一个下标j,让a[i]a[j]交换;……;直到剩下a[n-1]为止。

3.代码解析

#include <iostream>#include <fstream>#include <stdlib.h>using namespace std;int main(int argc, char *argv[]){    int a[10000];    for (int i=0; i<10000; i++)//生成不重复序列      a[i]=i;    srand((int)time(NULL));//设定随机数种子    for (int i=10000; i>0; i--)//为了写着方便,倒序交换    {        int j = rand()%i;        int temp = a[i-1];        a[i-1] = a[j];        a[j] = temp;    }    ofstream file("data.txt");//保存数据,以便测试    for (int i=0; i<10000; i++)      file<<a[i]<<"\t";    file.close();    return (0);}

4.数据查看

  • 使用python把前500个数据画成散点图,如下:

  • 使用python把前4000个数据画成散点图,如下:

    总体看来没有明显的间隔和聚集区域,直观上这些数据是随机的,当然可以使用数学方法检测数据的随机性(游程检验),感兴趣的同学可以试试

0 0