最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C語言隨機數設置的三種方式(保姆級教程)

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

前言

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

1、每次進入程序后的隨機數與上一次相同。

2、當隨機數設置過快時,可能會相同。

3、如何設置指定范圍的隨機數。

隨機數設置三板斧

在設置隨機數的時候,我們需要用到三個函數,它們分別是rand,time,srand。下面將一一進行講解:

第一式:rand函數

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

 rand函數的參數為空,返回值是一個0到RAND_MAX的整型數字。轉到定義,我們可以看到,RAND_MAX的值為0x7fff。轉為十進制為32767。

下面我們可以寫一段代碼生成10個隨機數并將它打印出來:

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

 我們可以運行看看,可以得到10個隨機數字:

但是細心的小伙伴就發(fā)現了(記得自己敲代碼觀察結果,由于本人不會做動圖,就麻煩各位佬自己敲代碼看了),好像每次運行代碼生成的10個隨機數都是一樣的。那是因為我們沒有設置隨機數種子,下面我們將講解如何設置隨機數種子:

第二式:srand函數

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

 我們可以看到:srand函數的參數為一個無符號整型數字,返回值為零,隨機數種子的設置是為了生成隨機數。

下面我們將設置一個隨即數種子再次生成10個隨機數:

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

好了,這次我們設置了一個隨機數種子,這下應該不會出問題了吧。我們再次運行我們的代碼:

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

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

小結:當我們在調用rand函數生成隨機數的時候。我們需要設置隨機數種子,如果我們設置的隨機數種子相同,那么產生的隨機數也是相同的,所以這時候我們就要設置不同的隨機數種子。在計算機中時間是變化的,所以我們可以用時間來做隨機數種子,每次程序運行的時間都不同,這樣就可以得到我們的隨機數了。

這里就要講到我們的time函數了

第三式:time函數

這里我們先講講時間戳:

Unix時間戳是指從1970年1月1日開始所經過的秒數,不考慮閏秒。

再次查看time函數的定義:(ps:C語言中的time函數調用后會返回一個時間戳

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

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

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

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;
}

現在我們運行程序的話就會發(fā)現,隨機數生成成功了。

常見問題:

1、每次進入程序后的隨機數與上一次相同。

這是因為我們在設置隨機數的時候 沒有設置種子 或者 設置種子的srand函數中的參數不是一個變化的值(參數不是時間戳)。

2、當隨機數設置過快時,可能會相同。

在設置隨機數的時候,我們只需要設置一個隨機種子就行了,如果我們每生成一個隨機數就設置一個隨機種子的話,由于程序運行的時間太快,可能時間戳會相同,從而產生的隨機數也一樣。

例如:

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;
}

我們運行一下程序:

所以,我們在設置隨機數的時候一定要檢查是否只設置了一個隨機數。

3、如何設置指定范圍的隨機數。

在設置隨機數的時候,如果我們想要生成的隨機數在一定范圍內,那么我們就要對隨機數進行一點小小的處理:

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

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

隨機數落在(1,n)

int q = rand()%n + 1;

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

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

相關文章

最新評論

遂溪县| 岑溪市| 江源县| 阿图什市| 荃湾区| 文成县| 岑巩县| 永济市| 永济市| 清涧县| 加查县| 屯昌县| 岱山县| 甘谷县| 新河县| 台南市| 霍邱县| 萨迦县| 阿拉善盟| 金门县| 高雄市| 确山县| 长泰县| 汕尾市| 清水河县| 理塘县| 兴和县| 云和县| 嵊泗县| 工布江达县| 乳山市| 云林县| 叶城县| 余干县| 龙门县| 宽甸| 论坛| 特克斯县| 乌鲁木齐县| 新巴尔虎右旗| 茌平县|