IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    不重复随机数列的生成即随机打乱一个数组的算法

    yoyo发表于 2014-12-11 10:32:00
    love 0

    假设一个长度为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);
    }
    


沪ICP备19023445号-2号
友情链接