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;
    }

    運行結果…………………………………………
    在這里插入圖片描述

    在這里插入圖片描述

    在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM