用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;
}