1. 程式人生 > >C語言rand()函式產生隨機數

C語言rand()函式產生隨機數

#include <stdlib.h>
#include <time.h>
int main() 
{   int i;
    srand((unsigned)time(NULL)); 
    for (i=0;i<10;i++)   printf("%d\n",rand()%6+1);
    return 0; 
} //產生1~6之間的隨機數;

執行結果:


根據百度百科,庫函式中系統提供了兩個函式用於產生隨機數:srand()和rand()。 原型為: 
函式一:int rand(void); 
返回一個[0,RAND_MAX]間的隨機整數。 
函式二:void srand(unsigned seed); 
引數seed是srand()的種子,用來初始化srand()的起始值。
 
系統在呼叫rand()之前都會自動呼叫srand(),如果在srand()裡給引數seed指定了一個值(這裡指定的值是當前時間),那麼 rand()就會將seed的值作為產生偽隨機數的初始值;而如果使用者在rand()前沒有呼叫過srand(),那麼系統預設將1作為偽隨機數的初始值,如果初始值是此時的1或是其他定值,那麼每次rand()產生的隨機數序列都是一樣的,這也就是所謂的“偽隨機數”。 
值得注意的是,如果srand()括號中沒有argument的話,程式是會報錯的,因為在函式原型中,srand()函式是要求加上內容的。簡而言之,即有如下點:
  1. rand()函式可以生成一個[0,RAND_MAX]間的隨機整數;(ISO IEC 9899 2011 (C11)標準中未規定 RAND_MAX 的具體數值。但該標準規定了RAND_MAX 的值應至少為32767。程式設計的時候,不應該對 RAND_MAX 的具體數值做任何假設。)
  2. srand()可以被認為是為rand()的“偽隨機數”的結果指定一個固定的序列,若未引用srand()函式,則程式預設srand()括號中的值為1;如果引用的話,srand()括號中不能為空;
  3. 為了確保生成的隨機數為儘可能符合概率上的隨機,需要呼叫一個函式time()(是指返回自 Unix 紀元(January 1 1970 00:00:00 GMT)起的當前時間的秒數的函式,主要用來獲取當前的系統時間,返回的結果是一個time_t型別),這個函式包含在標頭檔案time.h裡,在生成隨機數的呼叫下需強制型別轉換為(unsigned)time(),後面一個括號中必須填入(unsigned)time(NULL)或(unsigned)time(0)。
  4. 如果你要求產生的隨機數在某一範圍X~Y之內的話,只需要做如下處理即可:rand()%(X-Y+1)+X;
    再來舉一個例子吧:


    死亡的 cyk

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    Special Judge

    Problem Description

    復仇者聯盟沒有能夠阻止滅霸那個毀滅一半生命的響指,宇宙中一半的生命就此消失。有一個遙遠的星球: cyk 星,也不可避免的死亡了一半的 cyk 。

    cyk 星上一共有 6 個 cyk 
    - cyk0
    - cyk1
    - cyk2
    - cyk3
    - cyk4
    - cyk5

    受到滅霸響指的影響,死去了 3 個 cyk ,現在請你給出死去的這 3 個 cyk 的名字。

    Input

    沒有輸入。

    Output

    每行一個,輸出死去的 cyk 的名字,順序不限。

    Sample Input

    Sample Output

    cyk0
    cyk1
    cyk2

    Hint


    注意:每次提交題目都對應一個新的平行世界,因此死亡的 cyk 與其他世界的可能不同,但一定是 3 個(這句話的意思就是一次提交程式碼能不能AC完全看你個人運氣,但如果你程式碼沒問題,那你早晚會AC,時間問題。本人提交10次AC)

    Source

    MeiK
    程式碼如下:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main()
    {
        srand((unsigned)time(NULL));
        int i,k[100],j,flag=1;
        for(i=0; i<3; i++)
            k[i]=rand()%6+0;
        while(flag)
        { flag=0;
            for(i=0; i<3; i++)
                for(j=i+1; j<3; j++)
                {
                    if(k[j]==k[i])
                       {
                        k[j]=rand()%6+0;
                        flag=1;
                       }
                }
        }
        for(i=0; i<3; i++)
        {
            if(i==2)
                printf("cyk%d",k[i]);
            else
                printf("cyk%d\n",k[i]);
        }
    }
    


相關推薦

C語言rand()函式產生隨機數

#include <stdlib.h> #include <time.h> int main() { int i; srand((unsigned)time(NULL)); for (i=0;i<10;i++) pri

C語言 rand函式生成隨機數

在實際的專案中,有時候需要生成一個隨機數,在C語言中隨機數的生成可以通過使用rand函式來實現。 rand函式包含在標頭檔案stdlib.h裡,因此使用rand函式需要宣告包含stdlib.h。 #include<stdlib.h> #inc

C語言中如何產生隨機數

簡單的產生0~100隨機數的程式碼如下: #include<stdio.h> #include<time.h> void main() { int i=0,j=0;

C語言,如何產生隨機數(各種轉載)

1. 基本函式     在C語言中取隨機數所需要的函式是: intrand(void);voidsrand(unsignedintn);     rand()函式和srand()函式被宣告在標頭檔案stdlib.h中,所以要使用這兩個函式必須包含該標頭檔案:

思考中rand()函式產生隨機數需不需要srand()的發現

“在程式中每次呼叫rand()產生的數字都相同”這是不對的!!要知道為什麼不對,還是先說明一下rand()函式吧,rand()函式是會用系統提供的種子(沒有用srand()提供時)或者srand()提供的種子計算出一組隨機數,嗯,是一組!而不是一個!!可以把這一組數看做是儲存

關於c語言rand產生隨機數相同的問題(學習筆記)

函式rand是真正的隨機數生成器(可以產生從0到32767的隨機數),而srand會設定供rand使用的隨機數種子。呼叫rand()之前沒有呼叫srand(),系統就主動呼叫srand(),導致產生同樣的隨機數(隨機數種子相同)。/*常常使用:srand(time(NULL)

C語言中如何產生一個隨機數及其原理。

在C語言中,rand()函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是一個偽隨機數,是根據一個數,我們可以稱它為種子,為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這

matlab的rand()函式產生均勻分佈函式的正確用法 / matlab 中如何產生0-1上均勻分佈的隨機數

簡介 rand(m,n)會產生mxn大小的矩陣,矩陣的每個元素符合0~1的均勻分佈。 rand(n)會產生一個維度是n的列向量,每個元素符合0~1的均勻分佈。 rand()函式會返回一個0~1之間的隨機數。 Fr: http://blog.csdn.net/lioncv/

rand()函式產生隨機數為什麼是偽隨機數

     偽隨機數生成器將作為“種子”的數當作初始整數傳給函式。這粒種子會使這個球(生成偽隨機數)一直滾下去。偽隨機數生成器的結果僅僅是不可預測。由偽隨機數生成器返回的每一個值完全由它返回的前一個值所決定(最終,該種子決定了一切)。如果知道用於計算任何一個值的那個整數,那麼就

C++猜數字遊戲的程式,用srand()函式產生隨機數

/* 編寫一個猜數字遊戲的程式:程式隨機選擇一個1到1000的數,然後輸出:     I have a number between 1 and 1000.         Can you guess

C語言 trim函式實現

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> //去除尾部空格 char *rtrim(char *str) { if(str == N

C語言函式宣告、形參、實參

函式原型: 原型prototype是函式的宣告;描述了函式的返回值與引數;  函式原型說明了兩點: 1、該函式的返回值 2、該函式的引數及其型別 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 函式的引數: 引數到底是什

C語言isalpha函式

看程式碼: #include<ctype.h> #include<stdio.h> #include <iostream> using namespace std; int main(void){ char ch; int tot

c 語言函式遞迴來實現求 k 的 n 次方

       如果求取k的n次方,既可以用普通的方法實現,也可以用函式的遞迴來實現。        函式的遞迴即是自己呼叫自己的函式應用形式,即在main函式下定義一個函式,然後在這個函式內自己為了實現某個目的,函式

C語言探究函式遞迴的巧妙之處(以斐波那契數列為例)

對於許多C語言的初學者來說,函式是一個比較重要的版塊.函式的使用不僅在學習程式設計的時期可以方便我們解決一些問題.它在未來的工作中也是程式設計師們經常運用的東西.而函式的遞迴是函式這一版塊比較難懂的東西.因此小編以輸出斐波那契數列的第N項為例,來探討函式的遞迴的應用給我們的程式碼帶來的方便.

C語言 strrev函式

標頭檔案:#include<string.h> strrev()函式將字串逆置,其原型為: char *strrev(char *str); 【引數說明】str為要逆置的字串。 strrev()將str所指的字串逆置。 【返回值】返回指向逆置後的字串的指標。 strr

C語言函式(侵刪)

1.strlen 標頭檔案:#include <string.h> strlen()函式用來計算字串的長度,其原型為:unsigned int strlen (char *s);  s為指定的字串 #include<stdio.h> #include<

C語言assert函式完全攻略

斷言assert函式,C語言assert函式完全攻略 對於斷言,相信大家都不陌生,大多數程式語言也都有斷言這一特性。簡單地講,斷言就是對某種假設條件進行檢查。在 C 語言中,斷言被定義為巨集的形式(assert(expression)),而不是函式,其原型定義在<assert.h>檔

C語言read函式的那些坑

  今天在複習UNIX檔案系統,用到那個read函式,但是無意中卻掉到一個坑裡了,用了一個多小時才找到問題根源,這裡記錄一下。   問題是這樣的:我需要使用read和write函式把鍵盤輸入的資訊複製到輸出。所以我寫了如下程式: #include<stdio.h> #define MAX

linux下的c語言系統函式呼叫

目錄 4.linux下的系統函式的使用 c語言 4.1數學函式的使用 1pow函式 2.exp函式 3.log函式 4.rand()隨機數函式 4.2字元函式的使用 4.3系統時間與日期函式的使用 系統時間 時間間隔 4.4環境控制函式 &nb