程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> ※C++隨筆※=)☆C++基礎☆=)※№→C++中 Rand隨機序列函數

※C++隨筆※=)☆C++基礎☆=)※№→C++中 Rand隨機序列函數

編輯:C++入門知識

標准庫(被包含於中)提供兩個幫助生成偽隨機數的函數:
函數一:int rand(void);
從srand (seed)中指定的seed開始,返回一個[seed, RAND_MAX(0x7fff))間的隨機整數。
函數二:void srand(unsigned seed);

參數seed是rand()的種子,用來初始化rand()的起始值。(一般情況下:我們都使用time(NULL)種子, 從一個時間點(一般是1970年1月1日0時0分0秒)到那時的秒數(即日歷時間))

#define RAND_MAX 0x7fffu
這個是bcc55中的定義,說明這個整數的最大數是0x7fffu,u代表unicode編碼。

PS: time(NULL)返回值是time_t,實際上是長整型,到未來的某一天。對於time_t數據類型的值來說,它所表示的時間不能晚於2038年1月18日19時14分07秒。不過基本上也夠大家使用了,如果需要更長的時間,可以使用64的_time64來進行處理。


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也是一個定值)。

產生隨機數的用法
1) 給srand()提供一個種子,它是一個unsigned int類型;
2) 調用rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到RAND_MAX之間);
3) 根據需要多次調用rand(),從而不間斷地得到新的隨機數;
4) 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步“隨機化”rand()的輸出結果。

一定范圍隨機數的通用表示公式

要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a;要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a;要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1;通用公式:a + rand() % n;其中的a是起始值,n是整數的范圍。要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。


MSDN標准示例代碼

// crt_rand.c
// This program seeds the random-number generator
// with the time, then exercises the rand function.
//

#include 
#include 
#include 

void SimpleRandDemo( int n )
{
   // Print n random numbers.
   int i;
   for( i = 0; i < n; i++ )
      printf( "  %6d\n", rand() );
}

void RangedRandDemo( int range_min, int range_max, int n )
{
   // Generate random numbers in the half-closed interval
   // [range_min, range_max). In other words,
   // range_min <= random number < range_max
   int i;
   for ( i = 0; i < n; i++ )
   {
      int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)
            + range_min;
      printf( "  %6d\n", u);
   }
}

int main( void )
{
   // Seed the random-number generator with the current time so that
   // the numbers will be different every time we run.
   srand( (unsigned)time( NULL ) );

   SimpleRandDemo( 10 );
   printf("\n");
   RangedRandDemo( -100, 100, 10 );
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved