在以下幾點:http://www.fredosaurus.com/notes-cpp/misc/random.htmlC++的隨機數
它提到,如果我們要生成範圍內1-10
一個隨機數,我們可以做到以下幾點:
r = (rand() % 10) + 1;
爲什麼我們增加1
?你能解釋一下這個過程是如何工作的嗎?
而且,關於初始化隨機數生成器,它提到執行以下操作:
srand(time(0));
你能解釋一下這個過程嗎?而且,如果我們根本不初始化會發生什麼?
謝謝。
在以下幾點:http://www.fredosaurus.com/notes-cpp/misc/random.htmlC++的隨機數
它提到,如果我們要生成範圍內1-10
一個隨機數,我們可以做到以下幾點:
r = (rand() % 10) + 1;
爲什麼我們增加1
?你能解釋一下這個過程是如何工作的嗎?
而且,關於初始化隨機數生成器,它提到執行以下操作:
srand(time(0));
你能解釋一下這個過程嗎?而且,如果我們根本不初始化會發生什麼?
謝謝。
隨機而不++ 1將使在用C 0-9狀陣列的範圍內的隨機數從0到n,這裏相同。非常第一個數字是0,所以得到1-10你添加最小值(1)。
你加1,因爲你想的隨機數1-10,而不是0-9,你會%
離不開+1
。
例如,10 % 10 == 0
和9 % 10 == 9
,所以這給你0-9。
添加+1
將 「移動」 這個區間1-10->10 % 10 + 1 == 1
和9 % 10 + 1 == 10
編輯:對不起,忘了你srand
問題。 rand()
生成相同的數字序列,除非你叫srand
和「種子」隨機數發生器用不同的價值,呼籲rand()
之前。所以,這裏time(0)
種子的隨機數發生器與當前時間,這給你所有時間不同的價值,你打電話rand()
爲什麼我們加1?
當您將一個數字除以10
時,餘數將介於0-9
之間。所以,要改變這個,我們加1。
rand()
返回範圍[0,RAND_MAX
]範圍內的int
。 rand() % 10
在範圍[0,9]返回int
因爲非負X模ķ爲至多ķ -1。加1會將範圍移至[1,10]。
(從rand() % k
的結果不保證是uniformly distributed。即使你打補丁了,這實在是產生推薦用於生成加密的密鑰等的隨機數,而不是窮人的方式。更強的RNG圖書館是Boost的一部分。)
srand(time(0))
以當前時間,用戶執行在隨機時間節目的希望。如果程序在時間t和t + 1s執行,隨機數發生器將確保它返回非常不同的結果。如果你不種它,你每次都可能得到相同的結果。不過,我不確定C標準對此有何評論。無論如何,如果您在運行很長時間的應用程序中播種一次,最終會開始重複。
(這又是無慾無求的RNG的窮人的方式。在Linux或BSD,從特殊文件/dev/random
讀得到「真正的」隨機種子。另外,請檢查您的操作系統可以與返回的時間至少微秒粒度。)
當執行分割時,「模」運算你得到的餘數。所以rand()
給你一個整數,rand() % 10
是0到9之間的數字加1的範圍爲1〜得到一個數字,以10個
隨機數生成器總是會產生相同的數字序列,除非你第一種子它們。 srand(time(0))
「根據當前時間以秒爲單位」隨機產生「一個數字。理論是,你將在不同的時間運行它,因此每次播種都會有所不同,因此每次運行程序時都會得到不同的數字序列。
模數部分由其他人回答。您必須使用srand(time(0))進行初始化,否則每次運行程序時都會得到相同的一系列隨機數。
據我瞭解,這是因爲產生了一定數量的開始,下面的數字是基於這樣的出發數量來計算。
你可以用你喜歡的任何數量的初始化,例如,用於測試你可以使用函數srand(0),並得到了相同的數字在過去的運行。要得到一個完全隨機的序列,你需要使用時間(0),因爲它初始化的實際時間以秒爲單位,對於大多數目的來說足夠隨機。
關於srand()函數,一個項目,我不認爲已經解釋 - 對於一個給定的種子,你總是會得到相同的隨機序列(不只是函數srand(0))。因爲時間(0)函數每秒都在變化,所以種子從運行到運行不可能是相同的,這就是爲什麼它經常與srand()一起使用的原因。
將隨機數發生器想象成具有單一輸入的複雜數學表達式。每次調用它時,它都會使用先前的輸出作爲輸入來生成下一個數字。結果是可以預測的,如果你的輸入是5,而你得到10次,那麼下次你也會得到它。所以除非你想在每次運行中使用相同的隨機序列(有時不是壞事!),你想要將第一個輸入(種子)設置爲某種(某種程度上)隨機的,比如當前時間。
警告:隨機數生成器在內部使用一個大得多的數目大於一個它們輸出,以便將「5讓你10」的例子中的輸入/輸出關係是通常不那麼簡單。但這個想法是一樣的。
模(``%)10給出在`範圍0-9`結果,因此`+ 1` – davka 2011-02-03 11:11:22
使用`蘭特()%k`只是普通不好的建議。對fredosaurus感到羞恥。 – 2011-02-03 11:24:51