<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本篇文章將為大家介紹在C語言中如何設定亂數,在設定亂數的過程中,大家可能會遇到以下問題:
1、每次進入程式後的亂數與上一次相同。
2、當亂數設定過快時,可能會相同。
3、如何設定指定範圍的亂數。
在設定亂數的時候,我們需要用到三個函數,它們分別是rand,time,srand。下面將一一進行講解:
我們可以開啟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個亂數字:
但是細心的小夥伴就發現了(記得自己敲程式碼觀察結果,由於本人不會做動圖,就麻煩各位佬自己敲程式碼看了),好像每次執行程式碼生成的10個亂數都是一樣的。那是因為我們沒有設定亂數種子,下面我們將講解如何設定亂數種子:
再次開啟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; }
好了,這次我們設定了一個亂數種子,這下應該不會出問題了吧。我們再次執行我們的程式碼:
細心的朋友又又又會發現了,這次怎麼還是不管執行多少次程式碼,結果還是一樣的呀,作者你這不坑人嘛!各位佬請冷靜,當srand函數中的引數是一個變化的數的時候我們才會生成真正的亂數(就像你遇到一個路口,每次你都進入同一個路口,那盡頭不都是一樣的嘛,只有當你選擇不同的路口進入的時候終點才不一樣)。那這個時候又有小夥伴要說話了,作者你拿我尋開心呢?你說要生成一個亂數,這裡你用srand又要用一個變化的引數,這不兩頭難嘛?
xdm別急。不妨想想在我們的計算機中什麼是變化的?那不就是時間嘛?時間可是無時無刻不在改變。
小結:當我們在呼叫rand函數生成亂數的時候。我們需要設定亂數種子,如果我們設定的亂數種子相同,那麼產生的亂數也是相同的,所以這時候我們就要設定不同的亂數種子。在計算機中時間是變化的,所以我們可以用時間來做亂數種子,每次程式執行的時間都不同,這樣就可以得到我們的亂數了。
這裡就要講到我們的time函數了
這裡我們先講講時間戳:
Unix時間戳是指從1970年1月1日開始所經過的秒數,不考慮閏秒。
再次檢視time函數的定義:(ps:C語言中的time函數呼叫後會返回一個時間戳)
這裡的time_t的本質其實是一個64位元的整型。我們可以看到time函數的引數是一個指標,那我們直接給他傳一個空指標就可以了。
值得注意的是:這裡的返回值型別為time_t,有的編譯器可能會發生警告,為了防止編譯器警告,我們可以將它強制轉換為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; }
現在我們執行程式的話就會發現,亂數生成成功了。
常見問題:
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語言亂數設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45