zoukankan      html  css  js  c++  java
  • 生成不重复随机数

        有一次需要生成N序列的不重复数字,最直观的理解就是不断生成一个小于N的随机数S,然后放入一个int[N]中:

        1.当S不存在于int[N]中时,将S添加到int[N]中。

        2.否则,重新生成S。

                Random random = new Random();
                int[] mat = new int[num];
                mat[0] = random.Next(0, num);
                int index = 2;
                while (index < num)
                {
                    bool find = false;
                    int tmp = random.Next(0, num);
                    for (int i = 0; i < index; i++)
                    {
                        if (tmp == mat[i])
                        {
                            break;
                        }
                        if (i == index - 1)
                        {
                            find = true;
                        }
                    }
                    if (find)
                    {
                        mat[index] = tmp;
                        index++;
                    }
    
                }
    

    这样的效率是极其低下的,当时怎么也不知道怎么想的就这么写了。后来觉得还是上网查找一下,得到一个更好的方法。

    生成一个N序列的数组int[N],生成一个随机位置P,将int[p]与int[i]对调。不断缩小i的范围直至0。这个数组内的值就被“打乱”了。 

           Random random = new Random();
                int[] mat = new int[num];
                int i, p=0, tmp=0;
                for(i=0;i<num;i++)
                    mat[i] = i;
                for (i = num-1; i >= 0;i-- )
                {
                    p = random.Next(0, i);
                    tmp = mat[p];
                    mat[p] = mat[i];
                    mat[i] = tmp;
                }
    
  • 相关阅读:
    IE浏览器不能启动,双击启动图标无效
    提示Internet Explorer 9 已安装在此系统上,无法完成安装
    React项目跨域处理(两种方案)
    Mock数据模拟Node服务器
    【LeetCode】15. 3Sum
    【C++】int与string互转
    【LeetCode】37. Sudoku Solver
    【LeetCode】149. Max Points on a Line
    【LeetCode】104. Maximum Depth of Binary Tree (2 solutions)
    【LeetCode】140. Word Break II
  • 原文地址:https://www.cnblogs.com/kulong995/p/1678673.html
Copyright © 2011-2022 走看看