詳解C語言的隨機數生成及其相關題目

2022-10-04 03:51:08 字數 1864 閱讀 4044

產生隨機數的基本方法

本文中,筆者將介紹c語言所提供的隨機數發生器的用法。現在的c編譯程式都提供了乙個基於一種ansi標準的偽隨機數發生器函式,用來生成隨機數。microsoft和borland都是通過rand()和srand()函式來支援這種標準的,它們的工作過程如下:

首先,給srand()提供乙個「種子」,它是乙個unsignde int型別,其取值範圍是從0到65,535 ;

然後,呼叫rand(),它會根據提供給srand()的「種子」值返回乙個隨機數(在0到32,7之間);

根據需要多次呼叫rand(),從而不斷地得到新的隨機數;

無論什麼時候,你都可以給srand()提供乙個新的「種子」,從而進一步「隨機化"rand()的輸出結果。

這個過程看起來很簡單,問題是如果你每次呼叫srand()時都提供相同的「種子」值,那麼你將會得到相同的「隨機」數序列。例如,在以17為「種子」值呼叫srand()之後,在你首次呼叫rand()時,你將得到隨機數94;在你第二次和第三次呼叫rand()時,你將分別得到26,602和30,017。這些數看上去是相當隨機的(儘管這只是乙個很小的資料點集合),但是,在你再次以17為「種子」值呼叫srand()之後,在對rand()的前三次呼叫中,所得到的返回值仍然是94、26,602和30,017,並且此後得到的返回值仍然是在對rand()的第一批呼叫中所得到的其餘的返回值。因此,只有再次給srand()提供乙個隨機的「種子」值,才能再次得到乙個隨機數。

下面的例子用一種簡單而有效的辦法來產生乙個相當隨機的「種子」值——當天的時間值。

# include

# include

# include

# include

void main (void)

} }

接下來,就是判斷rand_3是否能等概率的產生1,2,3.也就是我們需要計算產生1,2,3的概率是否都是1/3.

首先,rand_7可以等概率的產生1-7,我們以rand_3生成1為例,假設:

因此,rand_3生成1的概率是p(x=1)= 1/7 +  (4/7) * 1/7 + (4/7)^2 * 1/7 + ... + (4/7)^n-1 * 1/7 //等比數列

=  1/7 * ((1 - (4/7)^n) / 1 - 4/7) = 1/7 * 7/3 = 1/3

同理,可驗證生成2,3的概率均為1/3

結論上述證明說明rand3可以等概率的產生1,2,3.從上面的分析,我們可以得出乙個更一般的結論:

如果a>b,我們一定可以用rand_a去實現rand_b.其中,rand_a是等可能的生成1-a,rand_b是等可能的生成1-b

擴充套件現在給定兩個生成隨機數的函式rand_a和rand_b,rand_a和rand_b分程式設計客棧別產生1-a和1-b的隨機數,a和b不相等,現在讓你用rand_a實現rand_b,方法如下:

舉例說明

阿里2023年筆試題目,是給定生成1-7的隨即函式rand_7,看是否能程式設計客棧生成其它隨機數?

我們先看一下是否能等概率生成1-49,構造rand_49 = 7 * (rand_7 - 1) + rand_7 (ps:別問我7www.cppcns.com從**來的,rand_7既然能隨即生成1-7,我當然可以獲得到7了)

rand_7 - 1能等概率的生成0, 1, 2, 3, 4, 5, 6,每個數的生成概率都是1/7,所以*7之後,可以等概率的生成0,7,14,21,28,35,42,每個數的概率都是1/7

既然0,7,14,21,28,35,42每個數的概率都是1/7,當每個數都加上+rand_7之後,則1-49是等概率產生的,1/7 1/7 = 1/49,中間不會出現重複資料

所以,我們用rand_7產生了rand_49,有了rand_49,按照最初上面過濾的方法,我們當然可以獲得任何小於49的隨機函式

本文位址:

C語言隨機數生成超詳解

define crt secure no warnings include include include int main void printf 6d n rand system pause 執行這個程式你會發現,每次重啟程式。生成的隨機數都是固定的,這樣怎麼還能叫隨機數呢 2.解決方法 sra...

C語言生成隨機數

1 關於c語言中有rand 函式來產生隨機數,但是初始seed為1,這樣做有乙個問題,即會產生固定序列的數,比如單獨呼叫rand 時會產生 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 164976...

C語言隨機數的生成

在程式設計中,我們經常需要生成隨機數,例如,貪吃蛇遊戲中在隨機的位置出現食物,撲克牌遊戲中隨機發牌等。在c語言中,我們一般使用 標頭檔案中的 rand 函式來生成隨機數,它的用法為 int rand void void 表示不需要傳遞引數。c語言中還有乙個 random 函式可以獲取隨機數,但是 r...