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

詳解C語言隨機(jī)數(shù)設(shè)置的三種方式(保姆級(jí)教程)

 更新時(shí)間:2022年11月04日 11:16:03   作者:攢六便士ing  
本篇文章將為大家介紹在C語言中設(shè)置隨機(jī)數(shù)的三大方法的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定的幫助,需要的可以參考一下

前言

本篇文章將為大家介紹在C語言中如何設(shè)置隨機(jī)數(shù),在設(shè)置隨機(jī)數(shù)的過程中,大家可能會(huì)遇到以下問題:

1、每次進(jìn)入程序后的隨機(jī)數(shù)與上一次相同。

2、當(dāng)隨機(jī)數(shù)設(shè)置過快時(shí),可能會(huì)相同。

3、如何設(shè)置指定范圍的隨機(jī)數(shù)。

隨機(jī)數(shù)設(shè)置三板斧

在設(shè)置隨機(jī)數(shù)的時(shí)候,我們需要用到三個(gè)函數(shù),它們分別是rand,time,srand。下面將一一進(jìn)行講解:

第一式:rand函數(shù)

我們可以打開MSDN去看看rand函數(shù)的定義:

 rand函數(shù)的參數(shù)為空,返回值是一個(gè)0到RAND_MAX的整型數(shù)字。轉(zhuǎn)到定義,我們可以看到,RAND_MAX的值為0x7fff。轉(zhuǎn)為十進(jìn)制為32767。

下面我們可以寫一段代碼生成10個(gè)隨機(jī)數(shù)并將它打印出來:

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		int ret = rand();
		printf("%d ", ret);
	}
	printf("\n");
	return 0;
}

 我們可以運(yùn)行看看,可以得到10個(gè)隨機(jī)數(shù)字:

但是細(xì)心的小伙伴就發(fā)現(xiàn)了(記得自己敲代碼觀察結(jié)果,由于本人不會(huì)做動(dòng)圖,就麻煩各位佬自己敲代碼看了),好像每次運(yùn)行代碼生成的10個(gè)隨機(jī)數(shù)都是一樣的。那是因?yàn)槲覀儧]有設(shè)置隨機(jī)數(shù)種子,下面我們將講解如何設(shè)置隨機(jī)數(shù)種子:

第二式:srand函數(shù)

再次打開MSDN,查看我們的srand函數(shù)的定義:

 我們可以看到:srand函數(shù)的參數(shù)為一個(gè)無符號(hào)整型數(shù)字,返回值為零,隨機(jī)數(shù)種子的設(shè)置是為了生成隨機(jī)數(shù)。

下面我們將設(shè)置一個(gè)隨即數(shù)種子再次生成10個(gè)隨機(jī)數(shù):

int main()
{
	int i = 0;
	srand(666);
	for (i = 0; i < 10; i++)
	{
		int ret = rand();
		printf("%d ", ret);
	}
	printf("\n");
	return 0;
}

好了,這次我們設(shè)置了一個(gè)隨機(jī)數(shù)種子,這下應(yīng)該不會(huì)出問題了吧。我們再次運(yùn)行我們的代碼:

 細(xì)心的朋友又又又會(huì)發(fā)現(xiàn)了,這次怎么還是不管運(yùn)行多少次代碼,結(jié)果還是一樣的呀,作者你這不坑人嘛!各位佬請冷靜,當(dāng)srand函數(shù)中的參數(shù)是一個(gè)變化的數(shù)的時(shí)候我們才會(huì)生成真正的隨機(jī)數(shù)(就像你遇到一個(gè)路口,每次你都進(jìn)入同一個(gè)路口,那盡頭不都是一樣的嘛,只有當(dāng)你選擇不同的路口進(jìn)入的時(shí)候終點(diǎn)才不一樣)。那這個(gè)時(shí)候又有小伙伴要說話了,作者你拿我尋開心呢?你說要生成一個(gè)隨機(jī)數(shù),這里你用srand又要用一個(gè)變化的參數(shù),這不兩頭難嘛?

xdm別急。不妨想想在我們的計(jì)算機(jī)中什么是變化的?那不就是時(shí)間嘛?時(shí)間可是無時(shí)無刻不在改變。

小結(jié):當(dāng)我們在調(diào)用rand函數(shù)生成隨機(jī)數(shù)的時(shí)候。我們需要設(shè)置隨機(jī)數(shù)種子,如果我們設(shè)置的隨機(jī)數(shù)種子相同,那么產(chǎn)生的隨機(jī)數(shù)也是相同的,所以這時(shí)候我們就要設(shè)置不同的隨機(jī)數(shù)種子。在計(jì)算機(jī)中時(shí)間是變化的,所以我們可以用時(shí)間來做隨機(jī)數(shù)種子,每次程序運(yùn)行的時(shí)間都不同,這樣就可以得到我們的隨機(jī)數(shù)了。

這里就要講到我們的time函數(shù)了

第三式:time函數(shù)

這里我們先講講時(shí)間戳:

Unix時(shí)間戳是指從1970年1月1日開始所經(jīng)過的秒數(shù),不考慮閏秒。

再次查看time函數(shù)的定義:(ps:C語言中的time函數(shù)調(diào)用后會(huì)返回一個(gè)時(shí)間戳

 這里的time_t的本質(zhì)其實(shí)是一個(gè)64位的整型。我們可以看到time函數(shù)的參數(shù)是一個(gè)指針,那我們直接給他傳一個(gè)空指針就可以了。

值得注意的是:這里的返回值類型為time_t,有的編譯器可能會(huì)發(fā)生警告,為了防止編譯器警告,我們可以將它強(qiáng)制轉(zhuǎn)換為unsigned int類型。

那么現(xiàn)在我們就可以解決剛剛的問題了,我們修改一下代碼,再次運(yùn)行。

int main()
{
	int i = 0;
	srand((unsigned int)time(NULL));
	for (i = 0; i < 10; i++)
	{
		int ret = rand();
		printf("%d ", ret);
	}
	time_t;
	printf("\n");
	return 0;
}

現(xiàn)在我們運(yùn)行程序的話就會(huì)發(fā)現(xiàn),隨機(jī)數(shù)生成成功了。

常見問題:

1、每次進(jìn)入程序后的隨機(jī)數(shù)與上一次相同。

這是因?yàn)槲覀冊谠O(shè)置隨機(jī)數(shù)的時(shí)候 沒有設(shè)置種子 或者 設(shè)置種子的srand函數(shù)中的參數(shù)不是一個(gè)變化的值(參數(shù)不是時(shí)間戳)。

2、當(dāng)隨機(jī)數(shù)設(shè)置過快時(shí),可能會(huì)相同。

在設(shè)置隨機(jī)數(shù)的時(shí)候,我們只需要設(shè)置一個(gè)隨機(jī)種子就行了,如果我們每生成一個(gè)隨機(jī)數(shù)就設(shè)置一個(gè)隨機(jī)種子的話,由于程序運(yùn)行的時(shí)間太快,可能時(shí)間戳?xí)嗤?,從而產(chǎn)生的隨機(jī)數(shù)也一樣。

例如:

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		srand(time(NULL));
		int ret = rand();
		printf("%d ", ret);
	}
	time_t;
	printf("\n");
	return 0;
}

我們運(yùn)行一下程序:

所以,我們在設(shè)置隨機(jī)數(shù)的時(shí)候一定要檢查是否只設(shè)置了一個(gè)隨機(jī)數(shù)。

3、如何設(shè)置指定范圍的隨機(jī)數(shù)。

在設(shè)置隨機(jī)數(shù)的時(shí)候,如果我們想要生成的隨機(jī)數(shù)在一定范圍內(nèi),那么我們就要對隨機(jī)數(shù)進(jìn)行一點(diǎn)小小的處理:

如果想要生成的隨機(jī)數(shù)落在(0,n)

int q = rand()%(n+1) //生成的數(shù)與(n+1)整除,所以不包含n+1

隨機(jī)數(shù)落在(1,n)

int q = rand()%n + 1;

隨機(jī)數(shù)可以根據(jù)我們的需要進(jìn)行設(shè)置,希望各位小伙伴能夠靈活運(yùn)用,今天的分享就到這里了,希望我的文章能夠幫助到大家。要是有什么不對的地方也請各位指正。目前文章可能排版不是很好,但是我會(huì)努力的,希望自己的文章能夠越寫越好。祝各位水平越來越高,都能拿到好offer。

到此這篇關(guān)于詳解C語言隨機(jī)數(shù)設(shè)置的三種方式(保姆級(jí)教程)的文章就介紹到這了,更多相關(guān)C語言隨機(jī)數(shù)設(shè)置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口

    使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口

    設(shè)計(jì)一個(gè)上層的IPC接口,這個(gè)接口將在未來封裝底層的通信機(jī)制,這樣的設(shè)計(jì)要求接口足夠抽象,以便于底層實(shí)現(xiàn)的細(xì)節(jié)對上層用戶透明,本文給大家介紹了如何使用C++創(chuàng)建多個(gè)IPC機(jī)制的上層接口,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • bloom filter概念講解以及代碼分析

    bloom filter概念講解以及代碼分析

    Bloom filter 優(yōu)點(diǎn)就是它的插入和查詢時(shí)間都是常數(shù),另外它查詢元素卻不保存元素本身,具有良好的安全性
    2013-09-09
  • C++的字符串分割函數(shù)的使用詳解

    C++的字符串分割函數(shù)的使用詳解

    本篇文章主要介紹了C++的字符串分割函數(shù),主要用strtok、STL、Boost進(jìn)行字符串分割,有需要的可以了解一下。
    2016-11-11
  • C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表

    C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表

    這篇文章主要為大家詳細(xì)介紹了c語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c語言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)

    c語言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是一篇關(guān)于c語言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-10-10
  • Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果

    Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果,文中的實(shí)現(xiàn)過程講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • C語言 指針變量作為函數(shù)參數(shù)詳解

    C語言 指針變量作為函數(shù)參數(shù)詳解

    本文主要介紹C語言 指針變量作為函數(shù)參數(shù),這里整理了相關(guān)資料和示例代碼,以便大家學(xué)習(xí)參考理解知識(shí)點(diǎn),有需要的小伙伴可以參考下
    2016-08-08
  • C++編輯距離(動(dòng)態(tài)規(guī)劃)

    C++編輯距離(動(dòng)態(tài)規(guī)劃)

    這篇文章主要介紹了C++編輯距離(動(dòng)態(tài)規(guī)劃),編輯距離是指兩個(gè)字符串之間,由一個(gè)轉(zhuǎn)成另一個(gè)所需的最少編輯操作次數(shù),限免詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • C++中的函數(shù)返回值與拷貝用法

    C++中的函數(shù)返回值與拷貝用法

    這篇文章主要介紹了C++中的函數(shù)返回值與拷貝用法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言實(shí)現(xiàn)消消樂小游戲

    C語言實(shí)現(xiàn)消消樂小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)消消樂小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評(píng)論