1. 程式人生 > 實用技巧 >C語言隨機數的生成【詳解】

C語言隨機數的生成【詳解】

C語言隨機數的生成【詳解】

目錄

  • 一、rand 函式 和 srand 函式

    在C語言中比較常用的隨機函式是 rand 函式,它可以隨機的產生 0 ~ rand_max 的隨機數,定義型別不同最大值也不同,rand 函式包含在標頭檔案stdlib.h中。

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {<!-- -->
        int a=rand();
        printf("%d",a);
        return 0;
    }

    執行結果………………………………………… 你會發現每次產生的隨機數都是相同的,因為rand 函式產生的隨機數是偽隨機數,是根據一個數按照某個公式推算出來的,這個數我們稱之為“種子”,但是這個種子在系統啟動之後就是一個定值。

    要想每次產生的隨機數不一樣,那麼,我們就要用到 srand 函式。

    srand() 函式原型是:

    void srand (usigned int seed);

    rand() 產生隨機數時,如果用srand(seed) 播下種子之後,一旦種子相同,產生的隨機數將是相同的。當然很多時候刻意讓rand() 產生的隨機數隨機化,用時間作種子 srand(time(NULL)) ,這樣每次執行程式的時間肯定是不相同的,產生的隨機數肯定就不一樣了。 此段原文連結:

    https://blog.csdn.net/lvyibin890/article/details/80141412.如果想看rand和srand函式詳解,可觀看此文。

    通常可以利用 time(0) 或 getpid(0) 作為seed的返回值,下面我們只介紹用time(0)實現隨機數。

    srand((unsigned)time(NULL));   //用時間作種子
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {<!-- -->
        srand((unsigned)time(NULL));
        int n=rand();
        printf("%d\n",n);
        return 0;
    }


    此時我們就可以隨機產生一個數了。

    二、生成範圍隨機數公式

    但,作題時我們往往不會用到上面這種方式去產生一個隨機數,而是希望產生一定範圍內的資料。

    1產生隨機數範圍:[0,9]

    int a=rand()%10;  //注意10會被整除,所以不包括10

    2產生隨機數範圍:[0,99]

    int a=rand()%100;

    3產生隨機數範圍:[66,88]

    int a=66+rand()%23;

    結論產生隨機數範圍:[m,n]

    int a=m+rand()%(n-m+1);

    接下來舉幾個例子:

    注意:下面的程式會將 srand((unsigned)time(NULL)) 換成 srand(time(0)),用srand(time(0))方便,且一樣可以滿足以上產生範圍隨機數的各種情況。

    三、隨機數例項:選擇排序等

    ① 隨機產生10個[150,270)範圍內隨機數

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {<!-- -->
        int a[11];
        int i;
        printf("隨機產生10個[150,270)範圍內隨機數:\n\n");
        srand(time(0));   //srand(time(NULL));
        for(i=1;i<=10;i++)
            //一般鍵盤隨機輸入10個數方式:scanf("%d",&a[i]);
            a[i]=150+rand()%120;
        for(i=1;i<=10;i++)
            printf("%d ",a[i]);
        printf("\n");
        return 0; 
    }

    執行結果………………………………………… ② 隨機產生10個[0,99)範圍內隨機數(`指標`)

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {<!-- -->
        int a[10]; 
        int *p; 
        printf("隨機產生10個[0,99)範圍內隨機數:\n\n");
        srand(time(0));    //srand(time(NULL));    
        for(p=a;p<(a+10);p++)
            *p=rand()%100; 
        for(p=a;p<(a+10);p++)
            printf("%d ",*p);   //使用指標指向當前的陣列元素 
        printf("\n"); 
        return 0; 
    }

    執行結果………………………………………… ③ 地址 — 隨機數

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {<!-- -->
        int a[10];
        int i;
        printf("產生10個[0,99]隨機數:\n\n");
        srand(time(0));          //srand(time(NULL));   
        for(i=0;i<10;i++)
        {<!-- -->
            a[i]=rand()%100;      //隨機函式產生 [0,100)
            printf("%d  ",a[i]); 
        }
        printf("\n\n");
        printf("  地址   --- 隨機數\n\n"); 
        for(i=0;i<10;i++)
            printf(" %d --- %d\n",a+i,*(a+i));   //通過原陣列名和元素序號計算地址 
        printf("\n"); 
        return 0; 
    }

    執行結果…………………………………………

    ④ 例項:選擇排序

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {<!-- -->
        int a[10];
        int i,t,j,min;
        srand(time(0));
        printf("隨機產生10個[0,99]隨機數:\n");
        for(i=0;i<10;i++)
            a[i]=rand()%100;      //產生10隨機數
        for(i=0;i<10;i++)
            printf("%d ",a[i]);   //輸出隨機數
        printf("\n\n");
        for(i=0;i<=9;i++)
        {<!-- -->
            min=i;
            for(j=i+1;j<10;j++)
               if(a[min]>a[j])
                   min=j;
           if(i!=min)
           {<!-- -->
               t=a[i];
               a[i]=a[min];
               a[min]=t;
           } 
        } 
        printf("由小到大排序:\n");
        for(i=0;i<10;i++)
            printf("%d ",a[i]);
        return 0;
    }

    執行結果…………………………………………