簡體   English   中英

rand() 函數行為

[英]rand() function behavior

我正在學習 C 中的rand()函數,因為我想用它來生成一個范圍內的隨機數。 但是,我對下面的算法的一部分有疑問。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    const MAX = 20, MIN = 1;
    srand(time(NULL));
    int randNumber = rand() % (MAX - MIN + 1) + MIN;
    printf("%d", randNumber);
    // yeu cau nhap so
    int duDoan;
    printf("Moi ban du doan con so:");
    scanf("%d", &duDoan);
    // chay vong lap kiem tra
    while(duDoan != randNumber) {
        printf("Ban da sai. Moi nhap lai:");
        scanf("%d", &duDoan);
    }
    printf("Ban da nhap dung. Dap an la: %d ", randNumber);

    return 0;
}

令我困惑的是為什么我們必須在這一行中添加+ MIN

rand() % (MAX - MIN + 1) + MIN;

如果我離開它,結果會怎樣?

rand()是一個介於 0 和RAND_MAX之間的數字。

rand() % n是一個介於 0 和 n - 1 之間的數字。如果您想要一個從 0 到 n 的值,那么您需要rand() % (n+1)

在您的示例中(MAX - MIN + 1)是要生成的整數值的范圍,而MIN是較低的值。 例如,其中:

MIN = -10
MAX = 10

跨度n

n = (MAX - MIN + 1) = 21

以便:

rand() % n

產生從 0 到 20 的值,以及

rand() % n - MIN

是 -10 到 +10。 如果沒有 +1,它將錯誤地為 -10 到 +9。

請注意,在需要統計高質量隨機數的情況下,通過使用%來限制跨度是有缺陷的,並且當n不是RAND_MAX + 1的因子時會引入偏差。 在這種情況下(int)(n * ((double)rand() / (double)RAND_MAX))是一個更好的解決方案,所以你會有:

int randNumber = (int)((MAX - MIN) * ((double)rand() /
                                      (double)RAND_MAX)) + MIN ;

注意這里沒有 +1,因為(double)rand() / (double)RAND_MAX是 0 到 1,所以乘以 n 給出 0 到 n inclusive

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM