2013-11-02 15 views
3

我要生成隨機雙號x,其中:0 <= x <= 1獲得來自隨機雙號[0,1]在C++

double x = ((double) rand()/(RAND_MAX)); 

這是[0,1隨機獲得雙號的正確方法]?

+0

是的,它似乎是正確的。 –

+0

@ AbhishekBansal:謝謝!但是它會給我0和100%的1嗎?你確定? – nullpointer

+4

刪除括號中的一半。它們是多餘的。 –

回答

5

是的,因爲std::rand()同時返回0RAND_MAX。但是,如果您可以使用C++ 11,則可以使用std::uniform_real_distribution

而且不要忘了初始化隨機數生成器,否則你將得到在每一個執行相同的序列。如果您使用std::randstd::srand(std::time(0))幾乎總是足夠的。

+0

不幸的是,我不能使用C++ 11: ( – nullpointer

+1

@nullpointer:那麼你的原始方法是完全有效的,並且可以工作 – Zeta

3

是的。

雖然一些括號是多餘的。

它取決於你的應用是否可以信任你的系統蘭特(3)功能。對於嚴重的蒙特卡羅模擬,您需要一個數值庫中的記錄完備的隨機數發生器。

1

是但我建議投RAND_MAX到太加倍:

double r = ((double)rand()/(double)(RAND_MAX)); 

雖然有時不必要,編譯器可以自動轉換操作人員根據目標和源變量類型另一種類型。爲例如:

3.5/2可以等於1,而不是1.75,因爲除數是一個整數,並避免這一點,必須做到:

3.5/2.0或3.5 /(雙)2

+5

不,'3.5/2'永遠不會是'1';整數總是提升到浮點數,而不是相反。如果你不熟悉促銷規則,可能會使代碼稍微容易一些,但是這並不是必要的,除非你弄錯了,否則不會改變行爲。 –

+0

好吧......可能是舊的多編譯器,沒有尊重規則,我從很長一段時間得到了這種恥辱:) –

2

是的,我相信隨後會產生一個隨機序列給你0和1。但一定要初始化隨機數生成器函數,以避免一次又一次得到相同的序列。

1

如果你正在尋找一個隨機雙倍這是我如何實現它。

如果你正在尋找它的功能,我可以編輯這篇文章。

蘭特()包含文件stdlib.h內

#include <stdlib.h> 
    #include <time.h> 
    #include <iostream> 
    using namespace std; 
    int main() 
    { 
     double num; 
     double max; 

     srand(time(NULL)); 

     cout << "Enter a number."; 
     cin >> max; 

     num = (((double)rand()*(max)/RAND_MAX) - max) *(-1); 

     cout << num; 


    } 
+0

((double)rand()*(max)/ RAND_MAX)具有完全相同的效果。然而,生成範圍[min,max]中的數字可以使用:(((double)rand()*(max - min)/ RAND_MAX)+ min) – JasoonS