摘要:原型和配合使用產生偽隨機數序列。問題分析思路可以參照前面擲骰子小游戲的實現原理。
C語言每日一練
2021年11月21日
在開始今天的練習前,我先寫一個有趣的C語言小游戲——擲骰子(zhì tóu zi)
大家對骰子應該不陌生,讓我們先看看百度詞條的介紹:
擲骰子
拼音:zhì tóu zi
骰子: 既色子,用象牙、骨頭或塑料等較堅硬物體做的小四方塊;每面刻有點數,一到六,常用一對做各種游戲或賭博。
擲骰子:先搖動骰子,然后拋擲使兩個骰子都隨意停止在一平面上。
——百度百科
擲骰子時,每次能擲出的點數為1~6
,且是隨機的,那么如何用C語言來產生這一隨機數呢?
這時就要用到rand()
和srand()
函數了:
srand函數是隨機數發生器的初始化函數。原型:
void srand(unsigned int seed)
;
srand
和rand()
配合使用產生偽隨機數序列。
- rand():
原型:int rand(void)
,
功能:產生隨機值,從srand (seed)
中指定的seed
開始,返回一個[seed, RAND_MAX(0x7fff))
間的隨機整數。- srand():
原型:void srand(unsigned seed)
,
參數:seed
是rand()
的種子,用來初始化rand()
的起始值。
功能:可以認為rand()
在每次被調用時,它都會查看srand(seed)
中指定的seed值,如果存在srand(seed)
,那么它會自動調用srand(seed)
一次來初始化它的起始值。如果用戶在此之前沒有調用過srand(seed)
,它會自動調用srand(1)
一次。——百度百科
上面提到了rand()
函數只能生成偽隨機數,意思是如果起始值seed
固定,那么每次程序運行,它產生的隨機數序列都是相同的,而不是真正意義上的隨機數。形象地說,如果seed
值固定,那每次程序運行,第一次擲到的點數都是固定的,這顯然不合理,那怎么生成更加合理的隨機數呢?
補充:
種子在每次啟動計算機時是隨機的,但是一旦計算機啟動以后它就不再變化了;也就是說,每次啟動計算機以后,種子就是定值了,所以根據公式推算出來的結果(也就是生成的隨機數)就是固定的。——http://c.biancheng.net/view/2043.html
我們都知道系統的時間值(總秒數)是時刻都在變化著的,如果把時間秒數當做隨機數的種子seed
,那豈不是能實現真正的隨機數?答案是方法可行,但并不能產生真正的隨機數,因為時間是遞增的,是有規律的數字序列,所以產生的隨機數也會呈現一定的規律,但是,此時的隨機數已經足夠我們用來完成擲骰子游戲了,所以我們也沒必要去糾結是否是真正的隨機數(可能計算機本來就無法產生真正隨機數)。
要想獲取系統時間秒數,需要用到time()
函數:
time() 是指返回自 Unix 紀元(January 1 1970 00:00:00 GMT)起的當前時間的秒數的函數,主要用來獲取當前的系統時間,返回的結果是一個time_t類型。
time_t time(time_t *t);
如果t是空指針,直接返回當前時間。如果t不是空指針,返回當前時間的同時,將返回值賦予t指向的內存空間。
——百度百科
time_t
的原型就是long int
,這個函數的實現原理我們也沒必要去深究,我們只要清楚它能返回秒數就足夠了。
程序中,我們可以通過下面的語句初始化隨機數種子和產生隨機數:
srand((unsigned)time(NULL)); //用系統秒數初始化隨機數種子ret = rand(); //產生隨機數,賦值給ret變量
現在生成了隨機數,那如何將隨機數轉換成骰子的點數呢?
骰子一般都是正方體,有6個面,正面朝上的即為點數,那么它就有6種點數,分別是1~6
,我們將剛才生成的隨機數對6取余,即可將隨機數限定在0~5
之間,再加上1,就是我們要的隨機點數了:
ret = rand() % 6 + 1; //ret即為隨機點數
原理介紹完了,接下來直接上代碼
代碼由兩個部分構成:
- 菜單打印:打印功能選擇,顯示上次投骰子的結果
- 操作選擇:選擇擲骰子或退出退出程序
#include #include //srand()/rand()#include //time()int main(){ char choice = "/0"; //菜單選擇 int ret = 0; //用系統秒數初始化隨機數種子 srand((unsigned)time(NULL)); while(1) { /* 1.菜單打印 */ system("cls"); //清屏--Windows系統 printf("======================/n"); printf("| 擲骰子游戲 |/n"); printf("| 1:擲骰子 0:退出 |/n"); if(ret) printf("| 上輪點數:%d |/n", ret); printf("======================/n"); /* 2.操作選擇 */ printf("請選擇>>>>>>>/n"); scanf(" %c", &choice); //輸入選擇 //" %c" 可以吃前面的空格和回車 while(getchar() != "/n"); //吃掉除choice外其它字符 ret = 0; //初始化點數 switch(choice) { case "0": printf("Goodbye!/n"); return 0; //退出 //擲骰子(產生1 ~ 6 隨機數) case "1": ret = rand() % 6 + 1; break; default: printf("無效選擇!/n"); } } return 0;}
骰子是一個有六個面的正方體,每個面分別印有1?6之間的小圓點代表點數。假設這個游戲的規則是:兩個人輪流擲骰子6次,并將每次投擲的點數累加起來。點數多者獲勝;點數相同則為平局。
要求編寫程序模擬這個游戲的過程,并求出玩100盤之后誰是最終的獲勝者。
思路可以參照前面擲骰子小游戲的實現原理。
實現步驟:兩層循環,外層循環100次,內層循環6次,每次都將他們擲骰子的點數進行累加,最后總點數大的即為贏家,如果點數相同,則平局。
#include #include #include int main(){ int sum_1 = 0, sum_2 = 0; int i = 0, j = 0; //用系統秒數初始化隨機數種子 srand((unsigned)time(NULL)); for(i = 0; i < 100; i++) { for(j = 0; j < 6; j++) { //獲取骰子點數 sum_1 += rand() % 6 + 1; sum_2 += rand() % 6 + 1; } } printf("甲的總點數:%d/n", sum_1); printf("乙的總點數:%d/n", sum_2); if(sum_1 > sum_2) printf("甲獲勝!/n"); else if(sum_1 == sum_2) printf("平局.../n"); else printf("乙獲勝!/n"); return 0;}
由于擲骰子點數是隨機的,所以獲勝者也是隨機的。
結果1:
結果2:
把他們擲骰子次數調為1
,試了n次之后,終于平局了?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124091.html
摘要:語言每日一練年月日文章目錄題目描述問題分析代碼實現運行結果題目描述用語言編寫軟件完成以下任務一批選手參加比賽,比賽的規則是最后得分越高,名次越低。 C語言每日一...
摘要:文章前部分適合想了解比特幣和區塊鏈的非開發人員,整篇文章適合想轉入比特幣與區塊鏈相關開發的技術人員。張三和李四均可通過查詢區塊鏈網絡確認轉賬成功。 ??常見的比特幣與區塊鏈入門文章大約分為兩類,一類是面向非開發人員的科普讀物;另一類是面向開發人員的技術指南。前者易流于淺表,讓讀者接觸了一堆名詞和概念,卻無法對比特幣與區塊鏈有個直觀的認識;而后者又往往直接進入細節,使開發人員一葉障目不能...
摘要:小結本篇主要講述了如何生成數據集以及如何對其進行可視化如何使用創建簡單的圖表如果使用散點圖來探索隨機漫步過程如何使用創建直方圖,以及如何使用直方圖來探索同時擲兩個面數不同的骰子的結果。 《Python編程:從入門到實踐》筆記。從本篇起將用三篇的篇幅介紹如何用Python進行數據可視化。 1. 前言 從本篇開始,我們將用三篇的篇幅來初步介紹如何使用Python來進行數據可視化操作。本篇的...
摘要:于是我順著他的思路,用上了在中的屬性。修改效果如下但是這都不是我們需要的效果,因為幀動畫的關鍵在于瞬變。在的中,有一個屬性。表示將動畫分為幀。這個位置變化沒有過渡效果,這就是的特點階躍性。 昨天火急火燎地接到一個任務,說是要做一個擲骰子的游戲,關于擲骰子期間的過渡動畫,我本來是想用css 3d制作一個立體的骰子,然后叫UI給6張平面圖貼上去。再用translate3d來操作。然而UI考慮得...
摘要:于是我順著他的思路,用上了在中的屬性。修改效果如下但是這都不是我們需要的效果,因為幀動畫的關鍵在于瞬變。在的中,有一個屬性。表示將動畫分為幀。這個位置變化沒有過渡效果,這就是的特點階躍性。 昨天火急火燎地接到一個任務,說是要做一個擲骰子的游戲,關于擲骰子期間的過渡動畫,我本來是想用css 3d制作一個立體的骰子,然后叫UI給6張平面圖貼上去。再用translate3d來操作。然而UI考慮得十...
閱讀 3236·2021-11-24 10:43
閱讀 4197·2021-11-24 10:33
閱讀 3771·2021-11-22 09:34
閱讀 2125·2021-10-11 10:58
閱讀 3732·2021-10-11 10:58
閱讀 859·2021-09-27 13:36
閱讀 3579·2019-08-30 15:54
閱讀 2965·2019-08-29 18:41