隨機數(rand、srand函數+數組+指針+選擇排序)

目錄:

  1. rand 函數
  2. srand 函數
  3. 生成範圍隨機數
  4. 數組中用隨機數

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

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

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章