C# Random產生隨機數與相同隨機數解決辦法

來源:互聯網
上載者:User

第一種方法不指定隨機種子,系統自動選取目前時間作為隨機種子:

 代碼如下 複製代碼

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.