2015-10-08 80 views
0

在下面的代碼部分:日誌和RAND()給出了非數字

我想從範圍產生一個隨機數「U」 0至1, 然後我計算具有日誌

的方程

的錯誤是:U的一些值使日誌公式中給「非數字」值

我試圖鑄造「U」浮動或雙,甚至舍入爲2位小數,但同樣的錯誤

vector <double>Xs;//random Xs 
double x; 
double U; 

    while (check_arr < 360) 
    { 

     U = ((rand()/RAND_MAX) * 100)/100; 
     x = (log10(1 - U))/(-1/a); 
     Xs.push_back(x); 

    } 
+3

如果U變成1,會發生什麼? –

回答

1

log10()當傳遞給它的參數爲0時,將返回「不是數字」。當我在機器上運行該方法時,得到的結果是「-1。#INF000000000000」。 log(0)是無效的數字。您可以通過打開計算器您的PC上(如果你使用的是Windows)驗證這一點,切換到科學模式,然後嘗試做記錄0

數學解釋:

日誌基地10個功能使用幫助找到y的指數10^y=x。所以,當你試圖在0到插在功能你正在努力尋找解決如下:

10^y=0 

但沒有解決這個所以不是函數會返回一個無效的號碼。如果將x值的範圍設置爲0,那麼會更好0 < x < = 1,這樣就不會出現同樣的問題。

由於rand函數返回0和RAND-MAX之間的值,你可以可以使用以下方法來確保你不會輸入0到日誌功能:

U = (rand() % 100 + 1)/100; 

這將返回0.01的範圍內和1.您可以使用數字來增加/減少範圍。

4

您的代碼存在多個問題。 ()返回一個整數,RAND_MAX是一個整數,所以當你除它們時,你會得到一個幾乎總是爲零的整數(因爲rand()可以產生RAND_MAX值 - 一次在2^31上我的電腦 - 並且該部門將生產1)。

接下來,乘以然後除以100就什麼都不做。結果將是相同的:一個幾乎總是0的整數,有時是1.

最後,您必須避免將log10的值設爲零。這個值是不允許的,並且會引起零除異常(同樣,負值會引發無效的浮點異常)。

也許你可以使用下面的表達式來代替:

U = (rand() % 100)/100.0; 

這會給你的U值從0.00分發高達0.99包容性。當你再取log10(1-U)時,你將不會得到一個異常。

+2

注意:雖然你有一些正確的想法,但是(rand()%99)/ 100.0是錯誤的,原因有兩個。首先,它需要模100,而不是99,第二次使用非二冪數的模意味着業務不良(它「看起來不錯」,但實際上分配是有偏見的,而且這可能會給奇怪的問題很難查明)。 '(rand()&255)/ 255.0'要好得多。 – Damon

+0

非常正確,約99 vs 100 - 我在上面編輯它 - 抱歉。但是關於分配;如果OP關心,那麼他根本不應該使用rand(),因爲標準實現(乘法同餘PRNG)在較低位中具有非常差的熵。使用任何模運算會使得這種情況變得更糟,而不是更好,並且可以說二次冪運算比十進制運算更差。我除以100.0,因爲他說他已經嘗試四捨五入到小數點後兩位,這就是它的作用。 – cliffordheath