2011-02-03 89 views
3

在以下幾點:http://www.fredosaurus.com/notes-cpp/misc/random.htmlC++的隨機數

它提到,如果我們要生成範圍內1-10一個隨機數,我們可以做到以下幾點:

r = (rand() % 10) + 1;

爲什麼我們增加1?你能解釋一下這個過程是如何工作的嗎?

而且,關於初始化隨機數生成器,它提到執行以下操作:

srand(time(0));

你能解釋一下這個過程嗎?而且,如果我們根本不初始化會發生什麼?

謝謝。

+0

模(``%)10給出在`範圍0-9`結果,因此`+ 1` – davka 2011-02-03 11:11:22

+1

使用`蘭特()%k`只是普通不好的建議。對fredosaurus感到羞恥。 – 2011-02-03 11:24:51

回答

3

隨機而不++ 1將使在用C 0-9狀陣列的範圍內的隨機數從0到n,這裏相同。非常第一個數字是0,所以得到1-10你添加最小值(1)。

11

你加1,因爲你想的隨機數1-10,而不是0-9,你會%離不開+1

例如,10 % 10 == 09 % 10 == 9,所以這給你0-9。
添加+1將 「移動」 這個區間1-10->10 % 10 + 1 == 19 % 10 + 1 == 10


編輯:對不起,忘了你srand問題。 rand()生成相同的數字序列,除非你叫srand和「種子」隨機數發生器用不同的價值,呼籲rand()之前。所以,這裏time(0)種子的隨機數發生器與當前時間,這給你所有時間不同的價值,你打電話rand()

4

爲什麼我們加1?

當您將一個數字除以10時,餘數將介於0-9之間。所以,要改變這個,我們加1。

9

rand()返回範圍[0,RAND_MAX]範圍內的intrand() % 10在範圍[0,9]返回int因爲非負Xķ爲至多ķ -1。加1會將範圍移至[1,10]。

(從rand() % k的結果保證是uniformly distributed。即使你打補丁了,這實在是產生推薦用於生成加密的密鑰等的隨機數,而不是窮人的方式。更強的RNG圖書館是Boost的一部分。)

srand(time(0))以當前時間,用戶執行在隨機時間節目的希望。如果程序在時間tt + 1s執行,隨機數發生器將確保它返回非常不同的結果。如果你不種它,你每次都可能得到相同的結果。不過,我不確定C標準對此有何評論。無論如何,如果您在運行很長時間的應用程序中播種一次,最終會開始重複。

(這又是無慾無求的RNG的窮人的方式。在Linux或BSD,從特殊文件/dev/random讀得到「真正的」隨機種子。另外,請檢查您的操作系統可以與返回的時間至少微秒粒度。)

6
  • 當執行分割時,「模」運算你得到的餘數。所以rand()給你一個整數,rand() % 10是0到9之間的數字加1的範圍爲1〜得到一個數字,以10個

  • 隨機數生成器總是會產生相同的數字序列,除非你第一種子它們。 srand(time(0))「根據當前時間以秒爲單位」隨機產生「一個數字。理論是,你將在不同的時間運行它,因此每次播種都會有所不同,因此每次運行程序時都會得到不同的數字序列。

2

模數部分由其他人回答。您必須使用srand(time(0))進行初始化,否則每次運行程序時都會得到相同的一系列隨機數。

據我瞭解,這是因爲產生了一定數量的開始,下面的數字是基於這樣的出發數量來計算。

你可以用你喜歡的任何數量的初始化,例如,用於測試你可以使用函數srand(0),並得到了相同的數字在過去的運行。要得到一個完全隨機的序列,你需要使用時間(0),因爲它初始化的實際時間以秒爲單位,對於大多數目的來說足夠隨機。

1

關於srand()函數,一個項目,我不認爲已經解釋 - 對於一個給定的種子,你總是會得到相同的隨機序列(不只是函數srand(0))。因爲時間(0)函數每秒都在變化,所以種子從運行到運行不可能是相同的,這就是爲什麼它經常與srand()一起使用的原因。

將隨機數發生器想象成具有單一輸入的複雜數學表達式。每次調用它時,它都會使用先前的輸出作爲輸入來生成下一個數字。結果是可以預測的,如果你的輸入是5,而你得到10次,那麼下次你也會得到它。所以除非你想在每次運行中使用相同的隨機序列(有時不是壞事!),你想要將第一個輸入(種子)設置爲某種(某種程度上)隨機的,比如當前時間。

警告:隨機數生成器在內部使用一個大得多的數目大於一個它們輸出,以便將「5讓你10」的例子中的輸入/輸出關係是通常不那麼簡單。但這個想法是一樣的。