當前位置:才華齋>計算機>C語言>

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

C語言 閱讀(6.5K)

C言語中獲取、生成隨機數的方法有很多種,每種方法都有自己的特色。下面是小編為大家帶來的C言語中獲取、生成隨機數的三種方法,歡迎閱讀。

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

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

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

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

  一om 類

Random類預設的無參建構函式可以根據當前系統時鐘為種子,進行一系列演算法得出要求範圍內的偽隨機數.

程式碼如下:

Random rd = new Random();

int i = ();

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

程式碼如下:

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

{

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

eLine(()ring());

}

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

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

  二 類

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

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

程式碼如下:

eLine(uid()ring());

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

  三ryptoServiceProvider 類

ryptoServiceProvider

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

程式碼如下:

RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();

byte[] byteCsp = new byte[10];

ytes(byteCsp);

eLine(ring(byteCsp));

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

程式碼如下:

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

{

RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();

byte[] byteCsp = new byte[10];

ytes(byteCsp);

eLine(ring(byteCsp));

}

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

ratePassword()

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

程式碼如下:

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

//

// 摘要:

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

//

// 引數:

// numberOfNonAlphanumericCharacters:

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

//

// length:

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

//

// 返回結果:

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

例:

程式碼如下:

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

{

e(ratePassword(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*%

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