Fork me on GitHub

生成不重复随机数

    有一次需要生成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;
            }
posted @ 2010-03-04 22:41  idoku  阅读(258)  评论(0编辑  收藏  举报