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

牛刀小试(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个数据画成散点图,如下:
    牛刀小试(02)——生成不重复的随机数_第1张图片

  • 使用python把前4000个数据画成散点图,如下:
    牛刀小试(02)——生成不重复的随机数_第2张图片
    总体看来没有明显的间隔和聚集区域,直观上这些数据是随机的,当然可以使用数学方法检测数据的随机性(游程检验),感兴趣的同学可以试试

你可能感兴趣的:(牛刀小试(02)——生成不重复的随机数)