Random 類
命名空間:System
表示僞随機數生(shēng)成器,一(yī)種能夠産生(shēng)滿足某些随機性統計要求的數字序列的設備。
僞随機數是以相同的概率從一(yī)組有限的數字中(zhōng)選取的。所選數字并不具有完全的随機性,因爲它們是用一(yī)種确定的數學算法選擇的,但是從實用的角度而言,其随機程度已足夠了。
僞随機數的生(shēng)成是從種子值開(kāi)始。如果反複使用同一(yī)個種子,就會生(shēng)成相同的數字系列。産生(shēng)不同序列的一(yī)種方法是使種子值與時間相關,從而對于 Random 的每個新實例,都會産生(shēng)不同的系列。默認情況下(xià),Random 類的無參數構造函數使用系統時鍾生(shēng)成其種子值,而參數化構造函數可根據當前時間的計時周期數采用 Int32 值。但是,因爲時鍾的分(fēn)辨率有限,所以,如果使用無參數構造函數連續創建不同的 Random 對象,就會創建生(shēng)成相同随機數序列的随機數生(shēng)成器。
通過創建單個而不是多個 Random 對象可以避免此問題。
若要提高性能,請創建一(yī)個随時間推移能生(shēng)成多個随機數的 Random 對象,而不要反複新建會生(shēng)成同一(yī)個随機數的 Random 對象。
Random 成員(yuán)
名稱 ● 說明
Equals ● 确定指定的 Object 是否等于當前的 Object。(繼承自 Object。)
Finalize ● 允許 Object 在“垃圾回收”回收 Object 之前嘗試釋放(fàng)資(zī)源并執行其他清理操作。(繼承自 Object。)
GetHashCode ● 用作特定類型的哈希函數。(繼承自 Object。)
GetType ● 獲取當前實例的 Type。(繼承自 Object。)
MemberwiseClone ● 創建當前 Object 的淺表副本。(繼承自 Object。)
Next ● 已重載。 返回随機數。
NextBytes ● 用随機數填充指定字節數組的元素。
NextDouble ● 返回一(yī)個介于 0.0 和 1.0 之間的随機數。
Sample ● 返回一(yī)個介于 0.0 和 1.0 之間的随機數。
ToString ● 返回表示當前 Object 的 String。(繼承自 Object。)
用 C# 生(shēng)成不重複的随機數
來源:中(zhōng)國IT實驗室收集整理 2008-4-2
我(wǒ)(wǒ)們可以使用兩種方式初始化一(yī)個随機數發生(shēng)器:
第一(yī)種方法不指定随機種子,系統自動選取當前時間作爲随機種子:
Random ro = new Random();
第二種方法可以指定一(yī)個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%不是一(yī)樣。
之後,我(wǒ)(wǒ)們就可以使用這個Random類的對象來産生(shēng)随機數,這時候要用到Random.Next()方法。這個方法使用相當靈活,你甚至可以指定産生(shēng)的随機數的上下(xià)限。
不指定上下(xià)限的使用如下(xià):
int iResult;
iResult=ro.Next();
下(xià)面的代碼指定返回小(xiǎo)于100的随機數:
int iResult;
int iUp=100;
iResult=ro.Next(iUp);
而下(xià)面這段代碼則指定返回值必須在50-100的範圍之内:
int iResult;
int iUp=100;
int iDown=50;
iResult=ro.Next(iDown,iUp);
除了Random.Next()方法之外(wài),Random類還提供了Random.NextDouble()方法産生(shēng)一(yī)個範圍在0.0-1.0之間的随機的雙精度浮點數:
double dResult;
dResult=ro.NextDouble();
但是用Random類生(shēng)成題号,會出現重複,特别是在數量較小(xiǎo)的題目中(zhōng)要生(shēng)成不重複的的題目是很難的。
參考了網上的一(yī)些方法,找到兩類解決方法,一(yī)類是通過随機種子入手,使每一(yī)次的随機種子不同,來保證不重複;第二類是使用一(yī)些數據結構和算法。
下(xià)面主要就第二類介紹幾個方法:
方法1:思想是用一(yī)個數組來保存索引号,先随機生(shēng)成一(yī)個數組位置,然後把這個位置的索引号取出來,并把最後一(yī)個索引号複制到當前的數組位置,然後使随機數的上限減一(yī),具體(tǐ)如:先把這100個數放(fàng)在一(yī)個數組内,每次随機取一(yī)個位置(第一(yī)次是1-100,第二次是1-99,...),将該位置的數用最後的數代替。
int[] index = new int[15];
for (int i = 0; i < 15; i++)
index = i;
Random r = new Random();
//用來保存随機生(shēng)成的不重複的10個數
int[] result = new int[10];
int site = 15;//設置下(xià)限
int id;
for (int j = 0; j < 10; j++)
{
id = r.Next(1, site - 1);
//在随機位置取出一(yī)個數,保存到結果數組
result[j] = index[id];
//最後一(yī)個數複制到當前位置
index[id] = index[site - 1];
//位置的下(xià)限減少一(yī)
site--;
}
方法2:利用Hashtable。
Hashtable hashtable = new Hashtable();
Random rm = new Random();
int RmNum = 10;
for (int i = 0; hashtable.Count < RmNum; i++)
{
int nValue = http://blog.soso.com/qz.q/rm.Next(100);
if (!hashtable.ContainsValue(nValue) && nValue != 0)
{
hashtable.Add(nValue, nValue);
Console.WriteLine(nValue.ToString());
}
}
方法3:遞歸,用它來檢測生(shēng)成的随機數是否有重複,如果取出來的數字和已取得的數字有重複就重新随機獲取。
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[10];
int tmp=0;
int minValue=http://blog.soso.com/qz.q/1;
int maxValue=http://blog.soso.com/qz.q/10;
for (int i=0;i<10;i++)
{
tmp=ra.Next(minValue,maxValue); //随機取數
arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到數組中(zhōng)
}
.........
.........
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;
}
silverlight 2 Random 随機數解決方案
來源:我(wǒ)(wǒ)和未來有約會
2008-06-17 01:21 by nasa
using System;
using System.Security.Cryptography;
public class RNG
{
private static RNGCryptoServiceProvider rngp = new RNGCryptoServiceProvider();
private static byte[] rb = new byte[4];
/// <summary>
/// 産生(shēng)一(yī)個非負數的亂數
/// </summary>
public static int Next()
{
rngp.GetBytes(rb);
int value = http://blog.soso.com/qz.q/BitConverter.ToInt32(rb, 0);
if (value < 0) value = http://blog.soso.com/qz.q/-value;
return value;
}
/// <summary>
/// 産生(shēng)一(yī)個非負數且最大(dà)值在 max 以下(xià)的亂數
/// </summary>
/// <param name="max">最大(dà)值</param>
public static int Next(int max)
{
rngp.GetBytes(rb);
int value = http://blog.soso.com/qz.q/BitConverter.ToInt32(rb, 0);
value = http://blog.soso.com/qz.q/value % (max + 1);
if (value < 0) value = http://blog.soso.com/qz.q/-value;
return value;
}
/// <summary>
/// 産生(shēng)一(yī)個非負數且最小(xiǎo)值在 min 以上最大(dà)值在 max 以下(xià)的亂數
/// </summary>
/// <param name="min">最小(xiǎo)值</param>
/// <param name="max">最大(dà)值</param>
public static int Next(int min, int max)
{
int value = http://blog.soso.com/qz.q/Next(max - min) + min;
return value;
}
}
命名空間:System
表示僞随機數生(shēng)成器,一(yī)種能夠産生(shēng)滿足某些随機性統計要求的數字序列的設備。
僞随機數是以相同的概率從一(yī)組有限的數字中(zhōng)選取的。所選數字并不具有完全的随機性,因爲它們是用一(yī)種确定的數學算法選擇的,但是從實用的角度而言,其随機程度已足夠了。
僞随機數的生(shēng)成是從種子值開(kāi)始。如果反複使用同一(yī)個種子,就會生(shēng)成相同的數字系列。産生(shēng)不同序列的一(yī)種方法是使種子值與時間相關,從而對于 Random 的每個新實例,都會産生(shēng)不同的系列。默認情況下(xià),Random 類的無參數構造函數使用系統時鍾生(shēng)成其種子值,而參數化構造函數可根據當前時間的計時周期數采用 Int32 值。但是,因爲時鍾的分(fēn)辨率有限,所以,如果使用無參數構造函數連續創建不同的 Random 對象,就會創建生(shēng)成相同随機數序列的随機數生(shēng)成器。
通過創建單個而不是多個 Random 對象可以避免此問題。
若要提高性能,請創建一(yī)個随時間推移能生(shēng)成多個随機數的 Random 對象,而不要反複新建會生(shēng)成同一(yī)個随機數的 Random 對象。
Random 成員(yuán)
名稱 ● 說明
Equals ● 确定指定的 Object 是否等于當前的 Object。(繼承自 Object。)
Finalize ● 允許 Object 在“垃圾回收”回收 Object 之前嘗試釋放(fàng)資(zī)源并執行其他清理操作。(繼承自 Object。)
GetHashCode ● 用作特定類型的哈希函數。(繼承自 Object。)
GetType ● 獲取當前實例的 Type。(繼承自 Object。)
MemberwiseClone ● 創建當前 Object 的淺表副本。(繼承自 Object。)
Next ● 已重載。 返回随機數。
NextBytes ● 用随機數填充指定字節數組的元素。
NextDouble ● 返回一(yī)個介于 0.0 和 1.0 之間的随機數。
Sample ● 返回一(yī)個介于 0.0 和 1.0 之間的随機數。
ToString ● 返回表示當前 Object 的 String。(繼承自 Object。)
用 C# 生(shēng)成不重複的随機數
來源:中(zhōng)國IT實驗室收集整理 2008-4-2
我(wǒ)(wǒ)們可以使用兩種方式初始化一(yī)個随機數發生(shēng)器:
第一(yī)種方法不指定随機種子,系統自動選取當前時間作爲随機種子:
Random ro = new Random();
第二種方法可以指定一(yī)個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%不是一(yī)樣。
之後,我(wǒ)(wǒ)們就可以使用這個Random類的對象來産生(shēng)随機數,這時候要用到Random.Next()方法。這個方法使用相當靈活,你甚至可以指定産生(shēng)的随機數的上下(xià)限。
不指定上下(xià)限的使用如下(xià):
int iResult;
iResult=ro.Next();
下(xià)面的代碼指定返回小(xiǎo)于100的随機數:
int iResult;
int iUp=100;
iResult=ro.Next(iUp);
而下(xià)面這段代碼則指定返回值必須在50-100的範圍之内:
int iResult;
int iUp=100;
int iDown=50;
iResult=ro.Next(iDown,iUp);
除了Random.Next()方法之外(wài),Random類還提供了Random.NextDouble()方法産生(shēng)一(yī)個範圍在0.0-1.0之間的随機的雙精度浮點數:
double dResult;
dResult=ro.NextDouble();
但是用Random類生(shēng)成題号,會出現重複,特别是在數量較小(xiǎo)的題目中(zhōng)要生(shēng)成不重複的的題目是很難的。
參考了網上的一(yī)些方法,找到兩類解決方法,一(yī)類是通過随機種子入手,使每一(yī)次的随機種子不同,來保證不重複;第二類是使用一(yī)些數據結構和算法。
下(xià)面主要就第二類介紹幾個方法:
方法1:思想是用一(yī)個數組來保存索引号,先随機生(shēng)成一(yī)個數組位置,然後把這個位置的索引号取出來,并把最後一(yī)個索引号複制到當前的數組位置,然後使随機數的上限減一(yī),具體(tǐ)如:先把這100個數放(fàng)在一(yī)個數組内,每次随機取一(yī)個位置(第一(yī)次是1-100,第二次是1-99,...),将該位置的數用最後的數代替。
int[] index = new int[15];
for (int i = 0; i < 15; i++)
index = i;
Random r = new Random();
//用來保存随機生(shēng)成的不重複的10個數
int[] result = new int[10];
int site = 15;//設置下(xià)限
int id;
for (int j = 0; j < 10; j++)
{
id = r.Next(1, site - 1);
//在随機位置取出一(yī)個數,保存到結果數組
result[j] = index[id];
//最後一(yī)個數複制到當前位置
index[id] = index[site - 1];
//位置的下(xià)限減少一(yī)
site--;
}
方法2:利用Hashtable。
Hashtable hashtable = new Hashtable();
Random rm = new Random();
int RmNum = 10;
for (int i = 0; hashtable.Count < RmNum; i++)
{
int nValue = http://blog.soso.com/qz.q/rm.Next(100);
if (!hashtable.ContainsValue(nValue) && nValue != 0)
{
hashtable.Add(nValue, nValue);
Console.WriteLine(nValue.ToString());
}
}
方法3:遞歸,用它來檢測生(shēng)成的随機數是否有重複,如果取出來的數字和已取得的數字有重複就重新随機獲取。
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[10];
int tmp=0;
int minValue=http://blog.soso.com/qz.q/1;
int maxValue=http://blog.soso.com/qz.q/10;
for (int i=0;i<10;i++)
{
tmp=ra.Next(minValue,maxValue); //随機取數
arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到數組中(zhōng)
}
.........
.........
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;
}
silverlight 2 Random 随機數解決方案
來源:我(wǒ)(wǒ)和未來有約會
2008-06-17 01:21 by nasa
using System;
using System.Security.Cryptography;
public class RNG
{
private static RNGCryptoServiceProvider rngp = new RNGCryptoServiceProvider();
private static byte[] rb = new byte[4];
/// <summary>
/// 産生(shēng)一(yī)個非負數的亂數
/// </summary>
public static int Next()
{
rngp.GetBytes(rb);
int value = http://blog.soso.com/qz.q/BitConverter.ToInt32(rb, 0);
if (value < 0) value = http://blog.soso.com/qz.q/-value;
return value;
}
/// <summary>
/// 産生(shēng)一(yī)個非負數且最大(dà)值在 max 以下(xià)的亂數
/// </summary>
/// <param name="max">最大(dà)值</param>
public static int Next(int max)
{
rngp.GetBytes(rb);
int value = http://blog.soso.com/qz.q/BitConverter.ToInt32(rb, 0);
value = http://blog.soso.com/qz.q/value % (max + 1);
if (value < 0) value = http://blog.soso.com/qz.q/-value;
return value;
}
/// <summary>
/// 産生(shēng)一(yī)個非負數且最小(xiǎo)值在 min 以上最大(dà)值在 max 以下(xià)的亂數
/// </summary>
/// <param name="min">最小(xiǎo)值</param>
/// <param name="max">最大(dà)值</param>
public static int Next(int min, int max)
{
int value = http://blog.soso.com/qz.q/Next(max - min) + min;
return value;
}
}