您的位置:首页 > 其它

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

2016-01-08 19:50 190 查看

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

标签: 牛刀小试

1.题目描述

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

2.思路解析

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

该函数生成的是伪随机数

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

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

至于随机数不能重复,我们可以生成一个不重复的序列,假设数组
a
满足该条件,先从下标
[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个数据画成散点图,如下:



总体看来没有明显的间隔和聚集区域,直观上这些数据是随机的,当然可以使用数学方法检测数据的随机性(游程检验),感兴趣的同学可以试试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: