隨機數 C語言

2021-06-22 14:35:58 字數 1232 閱讀 4757

怎樣獲得某一範圍的隨機整數?

直接使用這種方法:

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 ...