1. 程式人生 > >用C#生成不重複的隨機數

用C#生成不重複的隨機數

最近在做一個能自動生成作業的教學系統時,出現以下問題:需要隨機生成一組不重複的題目,用C#中的Random類生成題號,可是他會出現重複,特別是在數量較小的題目中要生成不重複的的題目是很難的,參考了網上的一些方法,包括兩類,一類是通過隨機種子入手,使每一次的
隨機種子不同,來保證不重複,我沒有試過這種方法,不知道有沒有效,第二類是使用一些資料結構和演算法,我採用了第二種方法,思想是用
一個數組來儲存索引號,先隨機生成一個數組位置,然後把這個位置的索引號取出來,並把最後一個索引號複製到當前的陣列位置,然後使隨機數的上限減一,具體如:先把這100個數放在一個數組內,每次隨機取一個位置(第一次是1-100,第二次是1-99,...),將該位置的數用最後的數代替。程式碼如下:


        //從一百個數中取出不重複的50個數

    public int[] getRandom()
        {
            //用一個數組來儲存數
            int[] index = new int[100];
            for (int i = 0; i < 100; i++)
                index[i] = i;

            Random r = new Random();
            //用來儲存隨機生成的不重複的50個數
            int[] result = new int[50];
            int site = 100;//設定下限
            int id;
            for (int j = 0; j < 50; j++)
            {
                id = r.Next(site - 1);
                //在隨機位置取出一個數,儲存到結果陣列
                result[j] = index[id];
                //最後一個數複製到當前位置
                index[id] = index[site];

                //位置的下限減少一
                site--;
            }

            return result;
        }