怎樣獲得某一範圍的隨機整數?
直接使用這種方法:
rand()%n;
(試圖返回從0到n-1的整數)不好,因為許多隨機數生成器的低位並不隨機。
乙個較好的方法是:
(int)((double)rand()/((double)rand_max+1)*n)
兩種方法都需要知道rand_max,而且假設n要遠遠小於rand_max。
如果n值接近rand_max而隨機數生成器的範圍又不是n的整數倍(即(rand_max+1)%n!=0),則這些方法都會失效,某些輸出會比其他的頻率更高。(使用浮點數也沒有幫助。問題在於rand返回rand_max+1個互不相同的值,這些值不一定總是能被均分n塊。)如果出現這種問題,大概唯一能做的就是多次呼叫rand函式,然後丟棄某些值:
unsigned int x=(rand_max+1u)/n;
unsigned int y=x*n;
unsigned int r;
dowhile(r>=y)
return r/x;
在這種技術中,在需要的時候改變生成隨機數的範圍都很簡單,用下邊的方式可以生成範圍的隨機整數:
m+rand()/(rand_max/(n-m+1)+1)
(隨便提一下,rand_max是乙個常數,他告訴你c語言庫函式rand的固定範圍,不能將rand_max設為其他值,也不能要求rand返回其他範圍的值。)
如果你用的隨機數生成器返回的是0到1的浮點數,要取得範圍0到n-1的整數,只要將隨機數乘以n就可以了:
(int)(drand()*n)
每次執行程式,rand都返回相同的數字序列。為什麼?
這是多數偽隨機數生成器的乙個特徵(也是c語言庫函式的定義特徵),他們生成的隨機數總是從同乙個數字開始,然後是同乙個序列。(除了別的考量,增加一點可**性會讓除錯變得容易。)如果不需要這種可**性,可以呼叫srand用真正隨機數的值來初始化模擬隨機數生成的種子。常見的種子值可以是當前時間或用使用者案件之前過去的時間(當然很難可移植的判斷按鍵時間)。這裡有個使用當前時間的例子:
#include
#include
srand((unsigned int)time(time_t*)null);
但是,這個**並不完美---其中,time()返回的time_t可能是浮點值,轉換到無符號整數是可能上溢,這造成不可移植。
還要注意到,在乙個程式執行中多次呼叫srand並不見得由幫助,特別是不要為了試圖取得「真隨機數」而在每次呼叫rang前都呼叫srand。
C語言隨機數
在c語言函式庫中包含了乙個產生隨機數的函式 int rand void 函式返回的是乙個界於0 32767之間的偽隨機數,包括0和32767。注意,這裡產生的是偽隨機數,不是真正意義上的隨機數,看下面的程式 include stdlib.h include stdio.h void main 執行結...
c語言隨機數
隨機值函式rand 首先需要包含標頭檔案 include 計算機的優點是準確,並不擅長隨機和模擬,所以使用的rand 函式並不是真正意義上的隨機,而是一種偽隨機數使用rand 生成隨機數之前需要用隨機發生器的初始化函式srand unsigned seed 也位於stdlib.h 中 進行隨機數序列...
C語言產生隨機數
c語言產生隨機數需要呼叫stdlib.h標頭檔案中的兩個函式 int rand void 產生乙個0到rand max之間的隨機整數。rand max定義在stdlib.h,其值為2147483647 void srand int seed 用於初始化種子,便於每次產生不同的隨機數。include ...