程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> C#中獲取、生成隨機數的三種方法

C#中獲取、生成隨機數的三種方法

編輯:更多關於編程

       這篇文章主要介紹了C#中獲取、生成隨機數的三種方法,本文講解了Random 類生成法、Guid 類生成法以及RNGCryptoServiceProvider 類生成法,需要的朋友可以參考下

      隨機數的定義為:產生的所有數字毫無關系.

      在實際應用中很多地方會用到隨機數,比如需要生成唯一的訂單號.

      在C#中獲取隨機數有三種方法:

      一.Random 類

      Random類默認的無參構造函數可以根據當前系統時鐘為種子,進行一系列算法得出要求范圍內的偽隨機數.

       代碼如下:

      Random rd = new Random();

      int i = rd.Next();

      這種隨機數可以達到一些要求較低的目標,但是如果在高並發的情況下,Random類所取到的系統時鐘種子接近甚至完全一樣,就很有可能出現重復,這裡用循環來舉例

       代碼如下:

      for (int i = 0; i < 10; i++)

      {

      Random rd = new Random();  //無參即為使用系統時鐘為種子

      Console.WriteLine(rd.Next().ToString());

      }

      這個例子會輸出10個相同的"隨機數".

      突顯出的問題:因為Random進行偽隨機數的算法是固定的,所以根據同一個種子計算出的數字必然是一樣的.而以當代計算機的運行速度,該循環幾乎是在瞬間完成的,種子一致,所以會出現10次循環輸出同一隨機數的情況.

      二.Guid 類

      System.Guid

      GUID (Globally Unique Identifier) 全球唯一標識符

      GUID的計算使用到了很多在本機可取到的數字,如硬件的ID碼,當前時間等.所計算出的128位整數(16字節)可以接近唯一的輸出.

       代碼如下:

      Console.WriteLine(Guid.NewGuid().ToString());

      計算結果是xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx結構的16進制數字.當然這個格式也是可以更改的.

      三.RNGCryptoServiceProvider 類

      System.Security.Cryptography.RNGCryptoServiceProvider

      RNGCryptoServiceProvider 使用加密服務提供程序 (CSP) 提供的實現來實現加密隨機數生成器 (RNG)

       代碼如下:

      RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();

      byte[] byteCsp = new byte[10];

      csp.GetBytes(byteCsp);

      Console.WriteLine(BitConverter.ToString(byteCsp));

      因該類使用更嚴密的算法.所以即使如下放在循環中,所計算出的隨機數也是不同的.

      代碼如下:

      for (int i = 0; i < 10; i++)

      {

      RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();

      byte[] byteCsp = new byte[10];

      csp.GetBytes(byteCsp);

      Console.WriteLine(BitConverter.ToString(byteCsp));

      }

      但是RNGCryptoServiceProvider的計算較為繁瑣,在循環中使用會消耗造成大量的系統資源開銷,使用時需注意.''

      Membership.GeneratePassword()

      Membership是一個方便快捷的進行角色權限管理的類,偶然發現一個很有意思的方法,沒研究過是如何實現的

      代碼如下:

      public static string GeneratePassword(int length, int numberOfNonAlphanumericCharacters);

      //

      // 摘要:

      // 生成指定長度的隨機密碼。

      //

      // 參數:

      // numberOfNonAlphanumericCharacters:

      // 生成的密碼中的標點字符數。

      //

      // length:

      // 生成的密碼的字符數。長度必須介於 1 和 128 個字符之間。

      //

      // 返回結果:

      // 指定長度的隨機密碼。

      例:

       代碼如下:

      for (int i = 0; i < 10; i++)

      {

      Response.Write(Membership.GeneratePassword(20, 1) + "
    ");

      }

      結果為

      代碼如下:

      C!&^HoTNv3!ZHkK9BAbu

      azLgER)JJ-UW8q*14yz*

      I3qnb]Zxu16ht!kKZ!Q*

      9U:MAQ&c1x)^aed@xe**

      oL(%4JvfbP&t5*Hpl4l-

      6@zj$CnhW&D+|xOf:qIk

      A/!Di&l*tY$QaMH0gyzY

      z^wu6{1BMq7D^+WU]>f$

      1OgIJS3&09fw0F9.|aXA

      8F+Gy+L{O6x{SfugME*%

      不知是否正好符合你的要求?

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved