做项目的过程往往具有随机选取等过程。此笔记主要给出了随机生成N个不同的随机数的两种方法,然后简单的介绍了C++中随机数主要用到的函数srand,rand和time。最后给出了一个简单的例子,即从一个含有N张图片的文件夹中随机选取K张图片存入另外一个文件夹。
一:产生N个不同随机数的方法
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define N 20
#define K 10
void swap(int *a, int *b)
{
if(*a != *b){ // 异或操作 交换两个数字的位置
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
}
/******************************************************************************
*函数名称:void generateDiffRandV1(int a[], int n)
*函数功能:产生互不相同的随机数
*入口参数:
*返 回 值:无
*备 注:以空间换时间
*******************************************************************************/
void generateDiffRandV1(int a[], int n, int k)
{
int i;
time_t t;
for (i = 0; i < n; i++){
a[i] = i;
}
srand((int)time(&t));
for (i = 0; i < k; i++){
swap(&a[i], &a[i+rand()%(n-i)]);
}
}
/******************************************************************************
*函数名称:void generateDiffRandV2(int a[], int n)
*函数功能:产生互不相同的随机数(产生随机数的范围是1~n-1)
*入口参数:
*返 回 值:无
*
*思 路:先生成一个放置座号的数组,然后从中随机抽取,抽取后为防止重复,立即归零。
* :每次生成座号,只需判断是否为0 即可,大大提高了程序执行的效率。
*******************************************************************************/
void generateDiffRandV2(int a[], int n)
{
int *flag =(int *)malloc(sizeof(int) * n);
static int flag_once = 0;
int i, index;
for(i = 0; i < n; i++)
flag[i] = i+1;
if(!flag_once){
srand(time(0));
flag_once = 1;
}
for(i = 0; i < n;){
index = rand() % n;
if(flag[index] != 0){
a[i++] = flag[index]-1;
flag[index] = 0;
}
}
free(flag);
}
void printArray(int a[], int n)
{
int i;
for (i = 0; i < n; i++){
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int a[N];
generateDiffRandV1(a, N, K);
printArray(a, N);
generateDiffRandV2(a, N);
printArray(a, N);
return 0;
}
二:srand,rand及time函数的简介
1:srand函数