第一種方法不指定隨機種子,系統自動選取目前時間作為隨機種子:
代碼如下 |
複製代碼 |
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%不是一樣。
時間短重複
2.利用種子產生不重複隨機數
(a)產生隨機數時:Random ran = new Random((int)DateTime.Now.Ticks);
代碼如下 |
複製代碼 |
ran .Next(minvale, maxvale); |
可以有效解決重複問題
PS: DateTime.Now.Ticks 為資料數的計時周期數
(b) Random random = new Random( GetRandomSeed( ) );//使用密碼編譯服務提供者 (CSP) 提供的實現來實現加密隨機數產生器 (RNG) s
代碼如下 |
複製代碼 |
tatic int GetRandomSeed( ) { byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider( ); rng.GetBytes( bytes ); return BitConverter.ToInt32( bytes , 0 ); } 或者 Random sourceGen = new Random(new Guid().GetHashCode());//利用Guid |
3.利用延時已耗用時間解決重複問題
Thread.Sleep(100);
4.遞迴,用它來檢測產生的隨機數是否有重複,如果取出來的數字和已取得的數字有重複就重新隨機擷取。
代碼如下 |
複製代碼 |
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; } |
其它一些參考
1: 返回一個共有n位元,其中m位是小數的隨機數
代碼如下 |
複製代碼 |
--------------------------------------------------------------------------------
function randomXiao(n,m){ var a = Math.pow(10, n+m); var b = random(a); return b=b/Math.pow(10, m); }
|
--------------------------------------------------------------------------------
可以用trace(randomXiao(3,2));實驗一下。這個函數 簡單。Math.pow(n,m)用於返回一個以n為底,m為指數的數。乘方!
# 2: 返回一個n到m之間的隨機數
代碼如下 |
複製代碼 |
--------------------------------------------------------------------------------
function randomNm(n,m){ if(m>=n){ return random(m-n+1)+n; } else { return false; } } |
--------------------------------------------------------------------------------
之所以用random(m-n+1)是因為隨機數的範圍是m-n,加上1使 得m也能在裡面。加上n保證隨機數以n為下限。
加上判斷使函數更完整。另外,如果要返回一個負數隨機數,也可以用randomNm(n,0);當 然,我想更一般的是用-random(n);
# 3: 返回一個字母
代碼如下 |
複製代碼 |
--------------------------------------------------------------------------------
function randomAscii(){ var c = String.fromCharCode(random(26)+65); if(random(2)){ return c.toLowerCase(); } return c; } |
--------------------------------------------------------------------------------
#4: 返回一個不區分大小寫隨機字母
如果要返回大寫,把if條件句去掉就行了。如果要返回小寫,可以把條件句改為恒成立,或者 去掉條件,最後一句改為:
return c.toLowerCase(); String.fromCharCode(number)函數返回number代表數位ASCII碼。
toLowerCase()用於將大寫字 母轉為小寫。
# 5: 返回一個n到m之間的k個互異隨機數
代碼如下 |
複製代碼 |
function randomKdiffer(n,m,k){ arrayK = []; var i = 0; while (i < k) { a = random(m-n+1)+n; for (var j = 0; j < i; j++) { if (a == arrayK[j]) { break; } } if (j == i) { arrayK[i] = a; i++; } } return arrayK; }
|