每次从未处理的数据集合中随机取出一个数字,然后把该数字放在数组的首部, 即数组首部存放的是已经处理过的数字 。 这是一个原地打乱顺序的算法,即可从有限集合获取不重复的随机值。
以下是c语言实现的代码和测试用例:
#include<stdio.h>
#include<stdlib.h>
#define max 20
/*
从一个有限的集合中随机取值,获取的值不重复取出,直到所有值都取出之后,重新计数
arr:有限集合,随机值的取值范围
pos:取出的随机值的标记,
size:有限集合的大小
return :有限集合中获取的随机值
*/
int GetRandomValue(int *arr,int *pos,int size)
{
int value,temp;
if(*pos >= size)
{
*pos = 0;
}
value = rand()%(size-*pos)+*pos;
temp = arr[*pos];
arr[*pos] = arr[value];
arr[value] = temp;
return arr[(*pos)++];
}
int main()
{
int i;
int pos = 0;
int table[max];
for(i = 0;i<max;i++)
{
table[i] = i+1;
}
for(i = 0;i<max*10;i++)
{
printf(" %2d ",GetRandomValue(table,&pos,max));
if(i != 0 && i%10 == 0)
printf("\n");
}
return 0;
}