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

C語言/C++如何生成隨機(jī)數(shù)

 更新時(shí)間:2016年04月13日 15:11:16   作者:牧云者  
這篇文章主要介紹了C語言/C++如何生成隨機(jī)數(shù),C語言/C++產(chǎn)生隨機(jī)數(shù)主要用到的是rand()函數(shù), srand()函數(shù),C語言/C++里沒有自帶的random(int number)函數(shù),如何解決?感興趣的小伙伴們可以參考一下

本文分享了C語言/C++如何生成隨機(jī)數(shù)的具體實(shí)現(xiàn)方法,供大家參考,具體內(nèi)容如下

C語言/C++怎樣產(chǎn)生隨機(jī)數(shù):這里要用到的是rand()函數(shù), srand()函數(shù),C語言/C++里沒有自帶的random(int number)函數(shù)。
(1) 如果你只要產(chǎn)生隨機(jī)數(shù)而不需要設(shè)定范圍的話,你只要用rand()就可以了:rand()會(huì)返回一隨機(jī)數(shù)值, 范圍在0至RAND_MAX 間。RAND_MAX定義在stdlib.h, 其值為2147483647。
例如:

#include<stdio.h>
#include<stdlib.h>
void main()
{
    for(int i=0;i<10;i+)
       printf("%d\n",rand());
}

(2) 如果你要隨機(jī)生成一個(gè)在一定范圍的數(shù),你可以在宏定義中定義一個(gè)random(int number)函數(shù),然后在main()里面直接調(diào)用random()函數(shù):
例如:隨機(jī)生成10個(gè)0~100的數(shù):

#include<stdio.h>
#include<stdlib.h>
#define random(x) (rand()%x)
void main()
{
   for(int x=0;x<10;x++)
      printf("%d\n",random(100));
}
 

(3)但是上面兩個(gè)例子所生成的隨機(jī)數(shù)都只能是 一次性的,如果你第二次運(yùn)行的時(shí)候輸出結(jié)果仍和第一次一樣。這與srand()函數(shù)有關(guān)。srand()用來設(shè)置rand()產(chǎn)生隨機(jī)數(shù)時(shí)的隨機(jī)數(shù)種子。 在調(diào)用rand()函數(shù)產(chǎn)生隨機(jī)數(shù)前,必須先利用srand()設(shè)好隨機(jī)數(shù)種子(seed), 如果未設(shè)隨機(jī)數(shù)種子, rand()在調(diào)用時(shí)會(huì)自動(dòng)設(shè)隨機(jī)數(shù)種子為1。上面的兩個(gè)例子就是因?yàn)闆]有設(shè)置隨機(jī)數(shù)種子,每次隨機(jī)數(shù)種子都自動(dòng)設(shè)成相同值1 ,進(jìn)而導(dǎo)致rand()所產(chǎn)生的隨機(jī)數(shù)值都一樣。
srand()函數(shù)定義 : void srand (unsigned int seed);
通??梢岳胓eypid()或time(0)的返回值來當(dāng)做seed
如果你用time(0)的話,要加入頭文件#include<time.h>
例如:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)
void main()
{
   srand((int)time(0));
   for(int x=0;x<10;x++)
      printf("%d\n",random(100));
}

隨機(jī)數(shù)在實(shí)際運(yùn)用中非常之多,如游戲設(shè)計(jì),信號(hào)處理,通常我們很容易得到平均分布的隨機(jī)數(shù)。但如何根據(jù)平均分布的隨機(jī)數(shù)進(jìn)而產(chǎn)生其它分布的隨機(jī)數(shù)呢?本文提出了一種基于幾何直觀面積的方法,以正態(tài)分布隨機(jī)數(shù)的產(chǎn)生為例討論了任意分布的隨機(jī)數(shù)的產(chǎn)生方法。

一、平均分布隨機(jī)數(shù)的產(chǎn)生
    大家都知道,隨機(jī)數(shù)在各個(gè)方面都有很大的作用,在vc的環(huán)境下,為我們提供了庫函數(shù)rand()來產(chǎn)生一個(gè)隨機(jī)的整數(shù)。該隨機(jī)數(shù)是平均在0~RAND_MAX之間平均分布的,RAND_MAX是一個(gè)常量,在VC6.0環(huán)境下是這樣定義的:
#define RAND_MAX 0x7fff
   它是一個(gè)short 型數(shù)據(jù)的最大值,如果要產(chǎn)生一個(gè)浮點(diǎn)型的隨機(jī)數(shù),可以將rand()/1000.0這樣就得到一個(gè)0~32.767之間平均分布的隨機(jī)浮點(diǎn)數(shù)。如果要使得 范圍大一點(diǎn),那么可以通過產(chǎn)生幾個(gè)隨機(jī)數(shù)的線性組合來實(shí)現(xiàn)任意范圍內(nèi)的平均分布的隨機(jī)數(shù)。例如要產(chǎn)生-1000~1000之間的精度為四位小數(shù)的平均分布 的隨機(jī)數(shù)可以這樣來實(shí)現(xiàn)。先產(chǎn)生一個(gè)0到10000之間的隨機(jī)整數(shù)。方法如下 :
int a = rand()000;
然后保留四位小數(shù)產(chǎn)生0~1之間的隨機(jī)小數(shù):
double b = (double)a/10000.0;
然后通過線性組合就可以實(shí)現(xiàn)任意范圍內(nèi)的隨機(jī)數(shù)的產(chǎn)生,要實(shí)現(xiàn)-1000~1000內(nèi)的平均分布的隨機(jī)數(shù)可以這樣做:
double dValue = (rand()000)/10000.0*1000-(rand()000)/10000.0*1000;
則dValue就是所要的值。
   到現(xiàn)在為止,你或許以為一切工作都已經(jīng)完成了,其實(shí)不然,仔細(xì)一看,你會(huì)發(fā)現(xiàn)有問題的,上面的式子化簡后就變?yōu)椋?br /> double dValue = (rand()000)/10.0-(rand()000)/10.0;
   這樣一來,產(chǎn)生的隨機(jī)數(shù)范圍是正確的,但是精度不正確了,變成了只有一位正確的小數(shù)的隨機(jī)數(shù)了,后面三位的小數(shù)都是零,顯然不是我們要求的,什么原因呢,又怎么辦呢。
   先找原因,rand()產(chǎn)生的隨機(jī)數(shù)分辨率為32767,兩個(gè)就是65534,而經(jīng)過求余后分辨度還要減小為10000,兩個(gè)就是20000而要求的分辨率為1000*10000*2=20000000,顯然遠(yuǎn)遠(yuǎn)不夠。下面提供的方法可以實(shí)現(xiàn)正確的結(jié)果:

double a = (rand()000) * (rand()00)/10000.0;
double b = (rand()000) * (rand()00)/10000.0;
double dValue = a-b;

 則dValue就是所要求的結(jié)果。在下面的函數(shù)中可以實(shí)現(xiàn)產(chǎn)生一個(gè)在一個(gè)區(qū)間之內(nèi)的平均分布的隨機(jī)數(shù),精度是4位小數(shù)。

double AverageRandom(double min,double max)
{
int minInteger = (int)(min*10000);
int maxInteger = (int)(max*10000);
int randInteger = rand()*rand();
int diffInteger = maxInteger - minInteger;
int resultInteger = randInteger % diffInteger + minInteger;
return resultInteger/10000.0;
}

   但是有一個(gè)值得注意的問題,隨機(jī)數(shù)的產(chǎn)生需要有一個(gè)隨機(jī)的種子,因?yàn)橛糜?jì)算機(jī)產(chǎn)生的隨機(jī)數(shù)是通過遞推的方法得來的,必須有一個(gè)初始值,也就是通常所說的隨 機(jī)種子,如果不對隨機(jī)種子進(jìn)行初始化,那么計(jì)算機(jī)有一個(gè)確省的隨機(jī)種子,這樣每次遞推的結(jié)果就完全相同了,因此需要在每次程序運(yùn)行時(shí)對隨機(jī)種子進(jìn)行初始 化,在vc中的方法是調(diào)用srand(int)這個(gè)函數(shù),其參數(shù)就是隨機(jī)種子,但是如果給一個(gè)常量,則得到的隨機(jī)序列就完全相同了,因此可以使用系統(tǒng)的時(shí) 間來作為隨機(jī)種子,因?yàn)橄到y(tǒng)時(shí)間可以保證它的隨機(jī)性。
   調(diào)用方法是srand(GetTickCount()),但是又不能在每次調(diào)用rand()的時(shí)候都用srand(GetTickCount())來初始 化,因?yàn)楝F(xiàn)在計(jì)算機(jī)運(yùn)行時(shí)間比較快,當(dāng)連續(xù)調(diào)用rand()時(shí),系統(tǒng)的時(shí)間還沒有更新,所以得到的隨機(jī)種子在一段時(shí)間內(nèi)是完全相同的,因此一般只在進(jìn)行一 次大批隨機(jī)數(shù)產(chǎn)生之前進(jìn)行一次隨機(jī)種子的初始化。下面的代碼產(chǎn)生了400個(gè)在-1~1之間的平均分布的隨機(jī)數(shù)。

double dValue[400];
srand(GetTickCount());
for(int i= 0;i < 400; i++)
{
double dValue[i] = AverageRandom(-1,1);
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 學(xué)生成績管理系統(tǒng)C++實(shí)現(xiàn)代碼

    學(xué)生成績管理系統(tǒng)C++實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了學(xué)生成績管理系統(tǒng)C++實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 使用C語言實(shí)現(xiàn)模糊搜索功能

    使用C語言實(shí)現(xiàn)模糊搜索功能

    本文所提到的模糊搜索是指輸入不完整的關(guān)鍵詞即可查詢到對應(yīng)的全部準(zhǔn)確結(jié)果。下面小編通過實(shí)例代碼給大家分享使用C語言實(shí)現(xiàn)模糊搜索功能,感興趣的朋友一起看看吧
    2018-08-08
  • C++使用初始化列表的方式來初始化字段的方法

    C++使用初始化列表的方式來初始化字段的方法

    今天小編就為大家分享一篇關(guān)于C++使用初始化列表的方式來初始化字段的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Visual Studio Community 2022(VS2022)安裝圖文方法

    Visual Studio Community 2022(VS2022)安裝圖文方法

    這篇文章主要介紹了Visual Studio Community 2022(VS2022)安裝方法,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn)

    詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn)

    這篇文章主要介紹了C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C++中const應(yīng)放在類型前還是后

    C++中const應(yīng)放在類型前還是后

    之前遇到小伙伴問C++中const加在類型名前和變量名前的區(qū)別,今天給大家簡單分析下。
    2016-05-05
  • C++詳細(xì)分析線程間的同步通信

    C++詳細(xì)分析線程間的同步通信

    線程間不通信的話,每個(gè)線程受CPU的調(diào)度,沒有任何執(zhí)行上的順序可言,線程1和線程2是根據(jù)CPU調(diào)度算法來的,兩個(gè)線程都有可能先運(yùn)行,是不確定的,線程間的運(yùn)行順序是不確定的,所以多線程程序出問題,難以復(fù)現(xiàn),本章我們就來了解線程間的同步通信
    2022-05-05
  • 深入分析C++派生類中的保護(hù)成員繼承

    深入分析C++派生類中的保護(hù)成員繼承

    這篇文章主要介紹了C++派生類中的保護(hù)成員繼承,深入對C++面向?qū)ο缶幊痰睦^承機(jī)制進(jìn)行了解析,需要的朋友可以參考下
    2015-09-09
  • OpenCV圖像處理之常見的圖像灰度變換

    OpenCV圖像處理之常見的圖像灰度變換

    這篇文章主要介紹了OpenCV圖像處理之常見的圖像灰度變換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 合并排序(C語言實(shí)現(xiàn))

    合并排序(C語言實(shí)現(xiàn))

    遞歸算法是把一個(gè)問題分解成和自身相似的子問題,然后再調(diào)用自身把相應(yīng)的子問題解決掉。這些算法用到了分治思想。
    2013-02-02

最新評(píng)論