C# 隨機數 Random 的使用
摘自:
http://www.pcjx.com/Dotnet/C/208333.html
我們在做能自動生成試卷的考試系統時,常常需要隨機生成一組不重複的題目,在.net Framework中提供了一個專門用來產生隨機數的類System.Random。
對於隨機數,大家都知道,計算機不可能產生完全隨機的數字,所謂的隨機數發生器都是通過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的結果來近似的模擬完全隨機數,這種隨機數被稱作偽隨機數。偽隨機數是以相同的概率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。偽隨機數的選擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果隨機種子一樣,那麼同一個隨機數發生器產生的隨機數也會一樣。一般地,我們使用同系統時間有關的引數作為隨機種子,這也是.net
Framework中的隨機數發生器預設採用的方法。
我們可以使用兩種方式初始化一個隨機數發生器:
第一種方法不指定隨機種子,系統自動選取當前時間作為隨機種子:
Random ro = new Random();
第二種方法可以指定一個int型引數作為隨機種子:
int iSeed=10;
Random ro = new Random(10);
long tick = DateTime.Now.Ticks;
Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));
這樣可以保證99%不是一樣。
之後,我們就可以使用這個Random類的物件來產生隨機數,這時候要用到Random.Next()方法。這個方法使用相當靈活,你甚至可以指定產生的隨機數的上下限。
不指定上下限的使用如下:
int iResult;
iResult=ro.Next();
下面的程式碼指定返回小於100的隨機數:
int iResult;
int iUp=100;
iResult=ro.Next(iUp);
而下面這段程式碼則指定返回值必須在50-100的範圍之內:
int iResult;
int iUp=100;
int iDown=50;
iResult=ro.Next(iDown,iUp);
除了Random.Next()方法之外,Random類還提供了Random.NextDouble()方法產生一個範圍在0.0-1.0之間的隨機的雙精度浮點數:
double dResult;
dResult=ro.NextDouble();
但是用Random類生成題號,會出現重複,特別是在數量較小的題目中要生成不重複的的題目是很難的,參考了網上的一些方法,包括兩類,一類是通過隨機種子入手,使每一次的隨機種子不同,來保證不重複;第二類是使用一些資料結構和演算法。下面主要就第二類介紹幾個方法。
方法1:思想是用一個陣列來儲存索引號,先隨機生成一個陣列位置,然後把這個位置的索引號取出來,並把最後一個索引號複製到當前的陣列位置,然後使隨機數的上限減一,具體如:先把這100個數放在一個陣列內,每次隨機取一個位置(第一次是1-100,第二次是1-99,...),將該位置的數用最後的數代替。
int[] index = new int[15];
for (int i = 0; i < 15; i++)
index = i;
Random r = new Random();
//用來儲存隨機生成的不重複的10個數
int[] result = new int[10];
int site = 15;//設定下限
int id;
for (int j = 0; j < 10; j++)
{
id = r.Next(1, site - 1);
//在隨機位置取出一個數,儲存到結果陣列
result[j] = index[id];
//最後一個數複製到當前位置
index[id] = index[site - 1];
//位置的下限減少一
site--;
}
方法2:利用Hashtable。[NextPage]
Hashtable hashtable = new Hashtable();
Random rm = new Random();
int RmNum = 10;
for (int i = 0; hashtable.Count < RmNum; i++)
{
int nValue = rm.Next(100);
if (!hashtable.ContainsValue(nValue) && nValue != 0)
{
hashtable.Add(nValue, nValue);
Console.WriteLine(nValue.ToString());
}
}
方法3:遞迴,用它來檢測生成的隨機數是否有重複,如果取出來的數字和已取得的數字有重複就重新隨機獲取。
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[10];
int tmp=0;
int minValue=1;
int maxValue=10;
for (int i=0;i<10;i++)
{
tmp=ra.Next(minValue,maxValue); //隨機取數
arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到陣列中
}
.........
.........
public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra)
{
int n=0;
while (n<=arrNum.Length-1)
{
if (arrNum[n]==tmp) //利用迴圈判斷是否有重複
{
tmp=ra.Next(minValue,maxValue); //重新隨機獲取。
getNum(arrNum,tmp,minValue,maxValue,ra);//遞迴:如果取出來的數字和已取得的數字有重複就重新隨機獲取。
}
n++;
}
return tmp;
}
相關文章
- C# 生成隨機數,呼叫Random方法C#隨機random
- AS使用Random函式建立隨機數random函式隨機
- Random獲取隨機數random隨機
- C#迴圈中使用Random生成隨機數有重複問題C#random隨機
- 隨機數種子(random seed)隨機random
- oracle隨機數 — dbms_randomOracle隨機random
- python random隨機模組使用Pythonrandom隨機
- Python生成隨機數random模組Python隨機random
- JavaScript 隨機數方法 Math.random()JavaScript隨機random
- 偽隨機數 pseudo random number隨機random
- dbms_random包呼叫隨機數的方法:random隨機
- 【C#】比較 Random 與 RandomNumberGenerator 生成隨機字串C#random隨機字串
- 【DBMS_RANDOM】使用 DBMS_RANDOM包生成隨機字串random隨機字串
- LevelDB 原始碼解析之 Random 隨機數原始碼random隨機
- python–模組之random隨機數模組Pythonrandom隨機
- javascript隨機數函式Math.random()JavaScript隨機函式random
- Java如何生成隨機數 - Random、ThreadLocalRandom、SecureRandomJava隨機randomthread
- Python隨機數生成模組random詳解Python隨機random
- Python模組學習:random 隨機數生成Pythonrandom隨機
- java Math數學工具及Random隨機函式Javarandom隨機函式
- 利用arc4random_uniform()產生隨機數randomORM隨機
- Python隨機函式random使用詳解Python隨機函式random
- 【RANDOM】使用dbms_random.string產生隨機字串的用法及應用random隨機字串
- 扒一扒隨機數(Random Number)的誕生歷史隨機random
- Python分享之數學與隨機數 (math包,random包)Python隨機random
- random隨機生成10個數,然後氣泡排序random隨機排序
- 概率論與梳理統計-隨機變數random variables隨機變數random
- Java學習關於隨機數工具類--Random類Java隨機random
- Random 專案總結 -11 產生隨機數字random隨機
- JAVA中生成隨機數Random VS ThreadLocalRandom效能比較Java隨機randomthread
- python 使用 random模組生成隨機測試資料Pythonrandom隨機
- Python標準庫12 數學與隨機數 (math包,random包)Python隨機random
- Swift 中隨機數的使用Swift隨機
- Spark2 Random Forests 隨機森林SparkrandomREST隨機森林
- 隨機函式DBMS_RANDOM.STRING隨機函式random
- GENERATING INTEGER RANDOM NUMBERS(幾種產生隨機數方法的效率分析) (轉)random隨機
- 獲取當前時間戳和隨機數的獲取、Java Random、ThreadLocalRandom、UUID類中的方法應用(隨機數)時間戳隨機JavarandomthreadUI
- Python 快速教程(標準庫12):數學與隨機數 (math包,random包)Python隨機random