假设一个长度为10的数组arr:
1,2,3,4,5,6,7,8,9,10
假设m=10
1、用系统随机函数得到一个小于m的随机数n
2、将arr[n]和数组最后一个元素即下标m-1所在的元素arr[m-1]交换,并将m减1
3、依次进行1、2这样的循环操作,直到m=0时终止操作
假设第 1 次操作后,倒数第 1 个和随机到的第 5 个元素交换:
1,2,3,4,10,6,7,8,9,5
第 2 次操作后,倒数第 2 个和随机到的第 2 个元素交换:
1,9,3,4,10,6,7,8,2,5
...
类推以上操作,直到最后只有1个元素可供随机,再也不能随机为止
以上算法可以用于获取指定个数的不重复随机数组,和打乱随机数组。
参考文章:http://www.cnblogs.com/eaglet/archive/2011/01/17/1937083.html
附上实现代码
void printarr(int *arr,int n) {
while(n-- > 1)printf("%d,",*(arr++));
printf("%d",*arr);
}
int main() {
srand(time(NULL));//初始化随机数种子
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int m = 10;
int n,tmp;
while(m > 1) {
//产生随机数(注意随机数范围: 0 ≤ n < m)
n = rand() % m;
//交互元素
tmp = arr[m - 1];
arr[m - 1] = arr[n];
arr[n] = tmp;
//递减,这样下次随机只随机前面没有被随机到的元素
m--;
}
printarr(arr,10);
}