1. 程式人生 > >c語言中關於srand((unsigned)time(NULL))和rand的區別

c語言中關於srand((unsigned)time(NULL))和rand的區別

一直以為rand()直接生成不同的隨機數,實驗結果不對才搜了下原因,轉載分享下...

可以認為rand()在每次被呼叫的時候,它會檢視:

1) 如果使用者在此之前呼叫過srand(seed),給seed指定了一個值,那麼它會自動呼叫

srand(seed)一次來初始化它的起始值。

2) 如果使用者在此之前沒有呼叫過srand(seed),它會自動呼叫srand(1)一次。

1) 如果希望rand()在每次程式執行時產生的值都不一樣,必須給srand(seed)中的seed一個變值,這個變值必須在每次程式執行時都不一樣(比如到目前為止流逝的時間)。

2) 否則,如果給seed指定的是一個定值,那麼每次程式執行時rand()產生的值都會一樣,雖然這個值會是[seed, RAND_MAX(0x7fff))之間的一個隨機取得的值。

3) 如果在呼叫rand()之前沒有呼叫過srand(seed),效果將和呼叫了srand(1)再呼叫rand()一樣(1也是一個定值)。

stdlib.h標頭檔案中有巨集#define RAND_MAX 0x7fff

rand()產生一個0到0x7ffff即0到32767之間的隨機數

rand()/(RAND_MAX+1.0)就等於一個0到1之間的小數了,因為rand()最大是32767最小是0,再除以32768就是一個0到1之間的小數(不能等於1),再乘以10就是一個0到10之間的數了(不等於10).最後再加1,就成了一個求1到10之間隨機數的式子了.

srand函式是隨機數發生器的初始化函式,原型:

void srand(unsigned seed);

它需要提供一個種子,如:

srand(1);

直接使用1來初始化種子。

不過常常使用系統時間來初始化,即使用

time函式來獲得系統時間,它的返回值為從 00:00:00 GMT, January 1, 1970

到現在所持續的秒數,然後將time_t型資料轉化為(unsigned)型在傳給srand函式,即:

srand((unsigned) time(&t));

還有一個經常用法,不需要定義time_t型t變數,即:

srand((unsigned) time(NULL));

直接傳入一個空指標,因為你的程式中往往並不需要經過引數獲得的t資料。

srand((int)getpid());

使用程式的ID(getpid())來作為初始化種子,在同一個程式中這個種子是固定的

隨機輸出十個0-100之間的整數

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

void main( void )

{

int i,k;

srand( (unsigned)time( NULL ) );

for( i = 0; i < 10;i++ )

{

k=rand()%100;

printf( " k=%d\n", k );

}

}

相關推薦

c語言中關於srand((unsigned)time(NULL))rand區別

一直以為rand()直接生成不同的隨機數,實驗結果不對才搜了下原因,轉載分享下... 可以認為rand()在每次被呼叫的時候,它會檢視: 1) 如果使用者在此之前呼叫過srand(seed),給seed指定了一個值,那麼它會自動呼叫 srand(seed)一次來初始

c言中 srand(time(NULL)); 這句話是什麽意思(尤其是 NULL

什麽 返回值 產生 con 現在時間 完成 時間 一個 div 這是兩個函數! srand函數 一個是srand函數!這是在調用rand()這個函數之前使用的!rand()是一個產生隨機數的函數!而srand是一個設置隨機數種子的函數!通常這兩個函數是一起使用的!來完成

C言中static修飾的函式普通函式的區別

用static修飾的函式,本限定在本原始碼檔案中,不能被本原始碼檔案以外的程式碼檔案呼叫。而普通的函式,預設是extern的,也就是說,可以被其它程式碼檔案呼叫該函式。 在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。普通 函式的定義和宣告預設情況下是extern的,但靜

srand((unsigned)time(NULL))隨機數

詳細解釋:連結 應用: 隨機抽取陣列中的數 //有放回------------------- #include<stdio.h> #include<string.h> #include<algorithm> #include <stdlib.h

C言中,標頭檔案原始檔的關係(轉)

//a.h void foo(); //a.c #include "a.h"   //我的問題出來了:這句話是要,還是不要? void foo() {      return; } //main.c #include "a.h" int main(int argc

C言中unsigned char是什麼型別?

unsigned char是無符號位元組型,char型別變數的大小通常為1個位元組(1位元組=8個位),且屬於整型。整型的每一種都有無符號(unsigned)和有符號(signed)兩種型別(float和double總是帶符號的),在預設情況下宣告的整型變數都是有符號的型別(

C言中scanf、gets、fgets的區別

1.scanf會讀取標準輸入緩衝區中的輸入行內容直到遇到回車或空白(回車、tab、空格)以換行為例,會把換行符之前的資料全部讀入到scanf指定的變數中,回車(\n)依然儲存 在緩衝區中,等待下次讀取標準輸入緩衝區 遇到上面這種情況一般需要加入一下程式碼來清空快取區的行

c言中char *name 與char name 的區別

要點:char* name="abc"指的是常量字串,不可以修改指標,是相容老的寫法;char[] name="abc"是指標,可以修改;在學習過程中發現了一個以前一直預設的錯誤,同樣char *c = "abc"和char c[]="abc",前者改變其內容程式是會崩潰的,

C言中EOF NULL NUL'\0'的區別

EOF:巨集常量(#define EOF -1),值為-1,是End Of File的縮寫,是檔案結束的標誌。需要注意的是,當資料以二進位制的方式存放到檔案中時,可能會有數值-1的出現,此時不能採用EOF作為檔案結束的標誌; NULL: 巨集常量(#define NULL 0),值可以為0(數值

C++程式設計中srand((unsigned int)(time(NULL)))這句程式碼的解讀

分享這個部落格連結,講的真的很好。 主要有以下3方面收穫: 1.srand跟rand的關係。 就是每次使用rand(),都會看之前呼叫了srand()函式沒有,沒有,預設呼叫了srand(1). 有呼叫,就是strang(seed),這裡的seed就是標

14.C言中time函式localtime獲取系統時間日期

C語言中time函式和localtime獲取系統時間和日期可以通過time()函式來獲得計算機系統當前的日曆時間(Calendar Time),處理日期時間的函式都是以本函式的返回值為基礎進行運算。1. time 函式 返回1970-1-1, 00:00:00以來經過的秒數 

【轉載】在C言中,double、long、unsigned、int、char類型數據所占字節數

src 有關 指針變量 none nbsp ide iso isp cli 和機器字長及編譯器有關系: 所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ANSI/ISO制訂的): 1 sizeof(short int)&

關於C言中的Complex(復數類型)imaginary(虛數類型)

http 個人 time 編譯 pop oat float environ real 關於C語言中的Complex(復數類型)和imaginary(虛數類型) 其實這裏的復數complex就是數學裏的復數,包含實部和虛部兩個部分,比如:x=2.1+6i,下面進行詳細介紹

c言中fscanffprintf

寫的權限 set per efi errno fclose pri form price 很多時候我們需要寫入數據到文件中時都覺得很困擾,因為格式亂七八槽的,可讀性太差了,於是我們就想有沒有什麽函數可以格式化的從文件中輸入和輸出呢,還真有。下面我將講解一下fscanf和fp

C言中,當計算字符數組長度時,用sizeof strlen 的原理及兩者的區別

指針 data- 編譯器 tracking 行處理 ews csdn 編譯 分配 字符數組的長度計算:必須以終止符’\0‘作為邊界,但對字符數組賦值時,有兩種方式: 1:定義時用字符初始化 (1)char chs[7] = {‘a‘, ‘c‘, ‘0‘, ‘z‘, ‘3

C言中的structtypedef struct<轉載>

對象 內部數據 編程 都是 內部 pre title HR 聲明 原文:http://www.nowamagic.net/librarys/veda/detail/1785 typedef為C語言的關鍵字,作用是為一種數據類型定義一個新名字。這裏的數據類型包括內部數據類

C言中typedefsizeof的註意事項

isp sizeof spa 註意 list數據 對象 audio 應該 user typedef的作用是給一個數據類型起一個別名。 typedef struct LIST { int data; }SeqList; SeqList 就相當於struct LIS

C言中的I/O函數scanf、getchar、printfputchar說明

重要 col ace 驗證 enter inpu 個數 是否 交互 scanf()、printf()、getchar()和putchar()這四個函數能夠讓用戶和程序交流,所以被稱為輸入/輸出函數,或簡稱為I/O函數。 這裏先結合緩沖輸入來講講scanf()和getchar

C言中fstat statlstat 區別

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c言中的getchar()EOF

一、getchar的兩點總結: 1.getchar是以行為單位進行存取的。 當用getchar進行輸入時,如果輸入的第一個字元為有效字元(即輸入是檔案結束符EOF,Windows下為組合鍵Ctrl+Z, Unix/Linux下為組合鍵Ctrl+D),那麼只有當最後一個輸入字元為換行符'\n'