blog1:
我們在做能自動生成試卷的考試系統(tǒng)時,常常需要隨機生成一組不重復的題目,在.net Framework中提供了一個專門用來產(chǎn)生隨機數(shù)的類System.Random。
對于隨機數(shù),大家都知道,計算機不可能產(chǎn)生完全隨機的數(shù)字,所謂的隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復雜的運算,用產(chǎn)生的結(jié)果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱 作偽隨機數(shù)。偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。所選數(shù)字并不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。偽隨機數(shù)的選 擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數(shù)都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果隨機種子一樣,那么同一個隨機數(shù)發(fā)生器產(chǎn)生 的隨機數(shù)也會一樣。一般地,我們使用同系統(tǒng)時間有關(guān)的參數(shù)作為隨機種子,這也是.net Framework中的隨機數(shù)發(fā)生器默認采用的方法。
我們可以使用兩種方式初始化一個隨機數(shù)發(fā)生器:
第一種方法不指定隨機種子,系統(tǒng)自動選取當前時間作為隨機種子:
Random ro = new Random();
第二種方法可以指定一個int型參數(shù)作為隨機種子:
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類的對象來產(chǎn)生隨機數(shù),這時候要用到Random.Next()方法。這個方法使用相當靈活,你甚至可以指定產(chǎn)生的隨機數(shù)的上下限。
不指定上下限的使用如下:
int iResult;
iResult=ro.Next();
下面的代碼指定返回小于100的隨機數(shù):
int iResult;
int iUp=100;
iResult=ro.Next(iUp);
而下面這段代碼則指定返回值必須在50-100的范圍之內(nèi):
int iResult;
int iUp=100;
int iDown=50;
iResult=ro.Next(iDown,iUp);
除了Random.Next()方法之外,Random類還提供了Random.NextDouble()方法產(chǎn)生一個范圍在0.0-1.0之間的隨機的雙精度浮點數(shù):
double dResult;
dResult=ro.NextDouble();
但是用Random類生成題號,會出現(xiàn)重復,特別是在數(shù)量較小的題目中要生成不重復的的題目是很難的,參考了網(wǎng)上的一些方法,包括兩類,一類是通過隨機種子入手,使每一次的隨機種子不同,來保證不重復;第二類是使用一些數(shù)據(jù)結(jié)構(gòu)和算法。下面主要就第二類介紹幾個方法。
方法1:思想是用一個數(shù)組來保存索引號,先隨機生成一個數(shù)組位置,然后把這個位置的索引號取出來,并把最后一個索引號復制到當前的數(shù)組位置,然后使隨機 數(shù)的上限減一,具體如:先把這100個數(shù)放在一個數(shù)組內(nèi),每次隨機取一個位置(第一次是1-100,第二次是1-99,...),將該位置的數(shù)用最后的數(shù) 代替。
int[] index = new int[15];
for (int i = 0; i < 15; i++)
index = i;
Random r = new Random();
//用來保存隨機生成的不重復的10個數(shù)
int[] result = new int[10];
int site = 15;//設(shè)置下限
int id;
for (int j = 0; j < 10; j++)
{
id = r.Next(1, site - 1);
//在隨機位置取出一個數(shù),保存到結(jié)果數(shù)組
result[j] = index[id];
//最后一個數(shù)復制到當前位置
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:遞歸,用它來檢測生成的隨機數(shù)是否有重復,如果取出來的數(shù)字和已取得的數(shù)字有重復就重新隨機獲取。
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); //隨機取數(shù)
arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到數(shù)組中
}
.........
.........
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) //利用循環(huán)判斷是否有重復
{
tmp=ra.Next(minValue,maxValue); //重新隨機獲取。
getNum(arrNum,tmp,minValue,maxValue,ra);//遞歸:如果取出來的數(shù)字和已取得的數(shù)字有重復就重新隨機獲取。
}
n++;
}
return tmp;
}
blog2:
/// <summary>
/// 功能描述:返回不重復隨機數(shù)數(shù)組
/// 作者: 楊艷峰
/// 創(chuàng)建日期:2006-4-30
/// </summary>
/// <param name="Num">隨機數(shù)個數(shù)</param>
/// <param name="minNum">隨機數(shù)下限</param>
/// <param name="maxNum">隨機數(shù)上限</param>
/// <returns></returns>
public int[] GetRandomArray(int Number,int minNum,int maxNum)
{
int j;
int[] b=new int[Number];
Random r=new Random();
for(j=0;j<Number;j++)
{
int i=r.Next(minNum,maxNum+1);
int num=0;
for(int k=0;k<j;k++)
{
if(b[k]==i)
{
num=num+1;
}
}
if(num==0 )
{
b[j]=i;
}
else
{
j=j-1;
}
}
return b;
}
blog3:
public static string GetRandomPassword(int length)
{
byte[] random = new Byte[length/2];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetNonZeroBytes(random);
StringBuilder sb = new StringBuilder(length);
int i;
for (i = 0; i < random.Length; i++)
{
sb.Append(String.Format("{0:X2}",random[i]));
}
return sb.ToString();
}
blog4:
Random newRandom=new Random();
string tempRandom="";
for(int i=0;i<4;i++)
{
string t=Convert.ToInt16(9*a.NextDouble()).ToString();
tempRandom+=t;
}
生成9位
Random newRandom=new Random();
string tempRandom="";
for(int i=0;i<9;i++)
{
string t=Convert.ToInt16(9*a.NextDouble()).ToString();
tempRandom+=t;
}
隨機生成“0”或“1”字符
Random newRandom=new Random();
string tempRandom="";
for(int i=0;i<1;i++)
{
string t=Convert.ToInt16(1*a.NextDouble()).ToString();
tempRandom+=t;
}
更正.請把 Random newRandom=new Random(); 換成 Random a=new Random();
public string GetRandom(int length)
{
string radstr = "";
Random random = new Random();
for (int i=0;i<length;i++)
{
int a = random.Next(10);
radstr+=a.ToString();
}
return radstr;
}
blog5:
C#生成隨機數(shù)小結(jié)
作者:dnawo 日期:2008-05-22
C#的Random類的實例方法Next可以生成一串偽隨機數(shù),Next有三個重載函數(shù):

程序代碼
public virtual int Next();
public virtual int Next(int maxValue);
public virtual int Next(int minValue, int maxValue);
1.public virtual int Next()說明:返回大于或等于零且小于 System.Int32.MaxValue 的 32 位帶符號整數(shù)。

程序代碼
Random rand = new Random();
Response.Write(rand.Next());
2.public virtual int Next(int maxValue)說明:返回大于或等于零且小于 maxValue 的 32 位帶符號整數(shù)。

程序代碼
Random rand = new Random();
Response.Write(rand.Next(100));
3.public virtual int Next(int minValue, int maxValue)說明:返回一個大于或等于 minValue 且小于 maxValue 的 32 位帶符號整數(shù)。

程序代碼
Random rand = new Random();
Response.Write(rand.Next(1000,2000));
和Random類相似的還有一個類Guid,可以用它的靜態(tài)方法NewGuid來返回一個全局唯一標識符:

程序代碼
Response.Write(Guid.NewGuid().ToString());
blog6:
# regular /// <summary> /// 返回大于或等于零且小于 System.Int32.MaxValue 的 32 位帶符號整數(shù)。 /// </summary> /// <returns></returns> public static void Next1() { Random rand = new Random(); Console.WriteLine(rand.Next()); } /// <summary> /// 返回大于或等于零且小于 maxValue 的 32 位帶符號整數(shù) /// </summary> /// <param name="maxValue"></param> /// <returns></returns> public static void Next2(int maxValue) { Random rand = new Random(); Console.WriteLine(rand.Next(100)); } /// <summary> /// 返回一個大于或等于 minValue 且小于 maxValue 的 32 位帶符號整數(shù)。 /// </summary> /// <param name="minValue"></param> /// <param name="maxValue"></param> /// <returns></returns> public static void Next3(int minValue, int maxValue) { Random rand = new Random(); Console.WriteLine(rand.Next(1000, 2000)); }
/// <summary> /// C#中隨機生成指定長度的密碼 /// </summary>
private static string MakePassword(int pwdLength) { //聲明要返回的字符串 string tmpstr = ""; //密碼中包含的字符數(shù)組 string pwdchars="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //數(shù)組索引隨機數(shù) int iRandNum; //隨機數(shù)生成器 Random rnd = new Random(); for(int i=0;i<pwdLength;i++) { //Random類的Next方法生成一個指定范圍的隨機數(shù) iRandNum = rnd.Next(pwdchars.Length); //tmpstr隨機添加一個字符 tmpstr += pwdchars[iRandNum]; } return tmpstr; } #endregular
|