c語言安全隨機數生成器,C語言隨機數生成

本文目錄一覽:

如何用C語言 寫一個隨機數生成器的程序

#include

stdio.h

#include

time.h

void

main()

{

int

iNum

=

0;

srand((unsigned)time(0));

iNum

=

rand()

%

100

+

1;

//隨機生成一個數,並對100取余,使它小於100(0~99)。再加1(1~100)

printf(“%d\n”,

iNum);

\\打印出來這個數

return;

}

如果想多生成幾個隨機數,可以有一個數組存儲,並用for循環實現隨機生成

int

aiNum[10]

=

{0};

int

iLoop

=

0;

//隨機生成10個數

for

(

iLoop

=

0;

iLoop

10;

iLoop++

)

{

aiNum[iLoop]

=

rand()

%

100

+

1;

}

怎麼用C語言生成隨機數?

生成1~13的隨機數,隨機數序列中沒有重複字數\x0d\x0a#include \x0d\x0a#include // 包含rand()函數說明\x0d\x0a#include \x0d\x0a#define N 13\x0d\x0avoid main( void )\x0d\x0a{ inti, j, num[N], tmp; //用當前時間種子重置隨機數生成器,使每次運行生成不同的隨機數\x0d\x0a srand((unsigned)time( NULL ) );\x0d\x0a for(i=0;i

回答於 2022-11-16

C語言編程中生成隨機數的初級教程

幾個概念

隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。

隨機數種子:隨機數的產生是由算術規則產生的,srand(seed)的隨機數種子不同,rand()的隨機數值就不同,倘若每次的隨機數種子一樣,則rand()的值就一樣。所以要產生隨機數,則srand(seed)的隨機數種子必須也要隨機的。

用srand()產生隨機數種子

原型:void srand ( unsigned int seed );

作用是設置好隨機數種子,為了讓隨機數種子是隨機的,通常用time(NULL)的值來當seed。

time()用於隨機數種子

函數原型:time_t time ( time_t * timer );

time()函數表示返回1970-1-1 00:00:00 到當前時間的秒數。

用的時候這樣:srand(unsigned(time(NULL)));例如產生1~10之間的隨機整數

#include#includeint main(){  srand(time(NULL));  for(int i=0;i 10;i++)  {    int randValue=rand()%10;  }}

上面的程序中要注意srand是在for循環外面的,如果把srand放到for循環裡面,則每次產生的隨機數都相同。

用rand()產生隨機數

原型:int rand ( void );

作用是產生一個隨機數,當然隨機數是有範圍的,為0~RAND_MAX之間,隨機數與隨機數種子有關。具體來說是,在產生隨機數 rand()被調用的時候,它會這樣執行:

如果用戶之前調用過 srand(seed)的話,他會重新調用一遍 srand(seed)以產生隨機數種子;

如果發現沒有調用過 srand(seed)的話,會自動調用 srand(1)一次。

如果調用srand(seed)產生的隨機數種子是一樣的.話(即seed的值相同),rand()產生的隨機數也相同。

所以,如果希望rand()每次調用產生的值都不一樣,就需要每次調用srand(seed)一次,而且seed不能相同。這裡就是經常採用time(NULL)產生隨機數種子的原因。

C語言中可以使用rand()函數來生成一個從0到RAND_MAX的uniform分布。基於這個函數,我們可以構造出一些特定的隨機數生成器來滿足我們的需求。

(一)0到1的uniform分布:

//generate a random number in the range of [0,1]double uniform_zero_to_one(){  return (double)rand()/RAND_MAX;}

(二)任意實數區間的uniform分布:

//generate a random real number in [start,end]double uniform_real(double start,double end){  double rate=(double)rand()/RAND_MAX;  return start+(end-start)*rate;}

(三)任意整數區間的uniform分布:

//generate a random integer number in [start,end)int uniform_integer(int start,int end){  int base=rand();  if(base==RAND_MAX)    return uniform_integer(start,end);  int range=end-start;  int remainder=RAND_MAX%range;  int bucket=RAND_MAX/range;  if(baseRAND_MAX-remainder)    return start+base/bucket;  else    return uniform_integer(start,end);}

這個函數要特別說明一下,平常時候我們都是用rand()%n來生成0到n-1的隨機數,但是按這種方法生成的分布並不是uniform的,另外由於RAND_MAX只有32767,因此要生成比這個數更大的隨機數需要另外想辦法,理論上可以直接用0到1的uniform分布直接放縮,但實際效果不好。這裡給出一種移位方式的實現。

(四)32bits的隨機數

//generate a random 32 bits integer number int rand32(){  return ((rand()16)+(rand()1)+rand()%2);}

有了32bits的隨機數生成方法,就可以構造32bits範圍內的隨機整數區間了,方法和之前16bits的情況一樣。

(五)32bits範圍內的隨機整數區間

//generate a random 32bits integer number in [start,end) int uniform_integer_32(int start,int end){   int base=rand32();  if(base==RAND32_MAX)    return uniform_integer_32(start,end);  int range=end-start;  int remainder=RAND32_MAX%range;  int bucket=RAND32_MAX/range;  if(baseRAND32_MAX-remainder)    return start+base/bucket;  else    return uniform_integer_32(start,end);}

這裡RAND32_MAX定義為0x7fffffff。

除此之外,利用rand()函數構造任意分布的隨機數也是個值得探討的問題。

理論上可以通過(0,1)的uniform分布,加上標準採樣方法(sampling)獲得。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198124.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 07:30
下一篇 2024-12-04 07:30

相關推薦

  • 打造照片漫畫生成器的完整指南

    本文將分享如何使用Python編寫一個簡單的照片漫畫生成器,本文所提到的所有代碼和技術都適用於初學者。 一、環境準備 在開始編寫代碼之前,我們需要準備一些必要的環境。 首先,需要安…

    編程 2025-04-29
  • Git secbit:一種新型的安全Git版本

    Git secbit是一種新型的安全Git版本,它在保持Git原有功能的同時,針對Git存在的安全漏洞做出了很大的改進。下面我們將從多個方面對Git secbit做詳細地闡述。 一…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 如何使用random生成不重複的隨機數

    在編程開發中,我們經常需要使用隨機數來模擬一些場景或生成一些數據。但是如果隨機數重複,就會造成數據的不準確性。這時我們就需要使用random庫來生成不重複且隨機的數值。下面將從幾個…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python生成隨機數的多種方法

    本文將從以下幾個方面詳細介紹如何使用Python生成隨機數。 一、random模塊的使用 Python內置的random模塊能夠生成偽隨機數,使用該模塊,可以生成隨機數、隨機整數等…

    編程 2025-04-29

發表回復

登錄後才能評論