欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用C#生成不重復的隨機數(shù)的代碼

 更新時間:2013年02月14日 20:50:41   作者:  
我們在做能自動生成試卷的考試系統(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)時間有關的參數(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;//設置下限
  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。
復制代碼 代碼如下:

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


附----:
在.net Framework中提供了一個專門用來產(chǎn)生隨機數(shù)的類System.Random。
計算機本身不可能產(chǎn)生完全隨機的數(shù)字,所謂的隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復雜的運算,用產(chǎn)生的結(jié)果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱 作偽隨機數(shù)。
偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。

所選數(shù)字并不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。偽隨機數(shù)的選擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數(shù)都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果隨機種子一樣,那么同一個隨機數(shù)發(fā)生器產(chǎn)生 的隨機數(shù)也會一樣。一般地,我們使用同系統(tǒng)時間有關的參數(shù)作為隨機種子,這也是.net Framework中的隨機數(shù)發(fā)生器默認采用的方法。

相關文章

  • C#批量修改文件后綴的實現(xiàn)方法

    C#批量修改文件后綴的實現(xiàn)方法

    這篇文章主要介紹了C#批量修改文件后綴的實現(xiàn)方法,本文介紹的方法是通用型的,你只要修改讀取的文件地址,想要讀取的文件后綴名,以及自己想更換的后綴名稱即可,感興趣的小伙伴跟著小伙伴一起來看看吧
    2024-07-07
  • c#連接sqlserver數(shù)據(jù)庫、插入數(shù)據(jù)、從數(shù)據(jù)庫獲取時間示例

    c#連接sqlserver數(shù)據(jù)庫、插入數(shù)據(jù)、從數(shù)據(jù)庫獲取時間示例

    這篇文章主要介紹了c#連接sqlserver數(shù)據(jù)庫、插入數(shù)據(jù)、從數(shù)據(jù)庫獲取時間示例,需要的朋友可以參考下
    2014-05-05
  • Unity快速生成常用文件夾的方法

    Unity快速生成常用文件夾的方法

    這篇文章主要介紹了Unity快速生成常用文件夾的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#批量插入數(shù)據(jù)到Sqlserver中的三種方式

    C#批量插入數(shù)據(jù)到Sqlserver中的三種方式

    這篇文章主要為大家詳細介紹了C#批量插入數(shù)據(jù)到Sqlserver中的三種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • C#如何使用XmlDocument訪問XML文件

    C#如何使用XmlDocument訪問XML文件

    本文介紹了XML文件的特點、用途、格式、示例、解析和處理方式,以及在C#中使用XmlDocument類進行增刪改查操作的方法,XML文件是一種靈活的數(shù)據(jù)描述和存儲方式,適用于各種應用場景,在C#中,通過XmlDocument類可以方便地對XML文件進行操作
    2024-12-12
  • C#實現(xiàn)語音播報功能

    C#實現(xiàn)語音播報功能

    這篇文章主要為大家詳細介紹了C#實現(xiàn)語音播報功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C#中抽象方法與虛擬方法的區(qū)別

    C#中抽象方法與虛擬方法的區(qū)別

    這篇文章主要介紹了C#中抽象方法與虛擬方法的區(qū)別,對于C#初學者來說可以深入理解抽象方法與虛擬方法,需要的朋友可以參考下
    2014-08-08
  • C#入門之結(jié)構(gòu)類型Struct

    C#入門之結(jié)構(gòu)類型Struct

    這篇文章介紹了C#入門之結(jié)構(gòu)類型Struct,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#使用動態(tài)規(guī)劃解決0-1背包問題實例分析

    C#使用動態(tài)規(guī)劃解決0-1背包問題實例分析

    這篇文章主要介紹了C#使用動態(tài)規(guī)劃解決0-1背包問題,實例分析了C#動態(tài)規(guī)劃算法的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • 關于C#線程的全面解析

    關于C#線程的全面解析

    這篇文章主要介紹了關于C#線程的全面解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論