動態

詳情 返回 返回

基於C的猜數字遊戲——詳解隨機數生成原理與技巧 - 動態 詳情

關鍵詞:隨機數

設計要求:生成一個100~200之間的隨機數,玩家有5次猜數字的機會。

以下為完整代碼。


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
    printf("*****  猜數字遊戲  *****\n");
    printf("*****  輸入1開始  ******\n");
    printf("*****  輸入0結束  ******\n");
    printf("*****  範圍為100~200  **\n");
}

void game()
{
    int r = 100 + rand() % (200 - 100 + 1);
    int guess = 0;
    int count = 5;
    while (1)
    {
        printf("剩餘機會%d,開始猜數字:", count);
        scanf("%d", &guess);
        if (r == guess)
        {
            printf("感謝您,猜對了!\n");
            break;
        }
        else if (r < guess)
        {
            printf("猜大了!\n");
        }
        else
        {
            printf("猜小了!\n");
        }
        count--;
        if (count == 0)
        {
            printf("你失敗了,正確答案為:%d\n", r);
            break;
        }
    }
}

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("請選擇:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            break;
        default:
            printf("輸入有誤\n");
            break;
        }
    } while (input);
    return 0;
}

該程序實現的關鍵在於生成隨機數。在C中,提供了一個函數叫rand,可以用來生成隨機數。使用它需要包含頭文件stdlib.h。該函數原型如下:

int rand (void)

生成的隨機數範圍是在0〜RAND_MAX之間,這個RAND_MAX的大小是依賴編譯器上實現的,但是大部分編譯器上是32767。

原理上,rand函數是對一個叫”種子“的基準值進行運算生成的隨機數,默認種子是1。詳細一點説,rand()生成的是偽隨機數,因為它是通過確定性的算法計算出來的,但只要種子足夠隨機(如時間),其結果在統計上就是隨機的。為了每次運行能生成不同的隨機數,我們需要改變種子。C語言中,又提供了一個函數叫srand,用來初始化隨機數的生成器,srand的原型如下:

void srand (unsigned int seed);

程序中在調用rand函數之前先調用srand函數,通過srand函數的參數seed來設置rand函數生成隨機數的時候的種子,只要種子在變化,每次生成的隨機數序列也就變化起來了。程序中我們一般是使用程序運行的時間作為種子的,因為時間時刻在發生變化的。

在C中,有一個函數叫time,就可以獲得這個時間。使用它需要包含頭文件time.h。time函數原型如下:

time_t time (time_t* timer);

time函數會返回當前的日曆時間,其實返回的是1970年1月1日0時0分0秒到現在程序運行時間之間的差值,單位是秒。返回的類型是time_t類型的,time_t類型本質上其實就是32位或者64位的整型類型。

time函數的參數timer如果是非NULL的指針的話,函數也會將這個返回的差值放在timer指向的內存中帶回去。

如果timer是NULL,就只返回這個時間的差值。time函數返回的這個時間差也被叫做:時間戳


正文完

Tip:如果要生成a~b的隨機數,a + rand() % (b - a + l)

user avatar vanve 頭像 pulsgarney 頭像 monkeynik 頭像 eolink 頭像 null_64c3172e40890 頭像 benpaodekaixinguo 頭像 ponponon 頭像 java_3y 頭像 f702 頭像 best_6455a509a2177 頭像 manshenjiroudehuajuan 頭像 chaoqiezi 頭像
點贊 27 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.