我要生成隨機雙號x
,其中:0 <= x <= 1
:獲得來自隨機雙號[0,1]在C++
double x = ((double) rand()/(RAND_MAX));
這是[0,1隨機獲得雙號的正確方法]?
我要生成隨機雙號x
,其中:0 <= x <= 1
:獲得來自隨機雙號[0,1]在C++
double x = ((double) rand()/(RAND_MAX));
這是[0,1隨機獲得雙號的正確方法]?
是的,因爲std::rand()
同時返回0
和RAND_MAX
。但是,如果您可以使用C++ 11,則可以使用std::uniform_real_distribution
。
而且不要忘了初始化隨機數生成器,否則你將得到在每一個執行相同的序列。如果您使用std::rand
,std::srand(std::time(0))
幾乎總是足夠的。
不幸的是,我不能使用C++ 11: ( – nullpointer
@nullpointer:那麼你的原始方法是完全有效的,並且可以工作 – Zeta
是的。
雖然一些括號是多餘的。
它取決於你的應用是否可以信任你的系統蘭特(3)功能。對於嚴重的蒙特卡羅模擬,您需要一個數值庫中的記錄完備的隨機數發生器。
是但我建議投RAND_MAX到太加倍:
double r = ((double)rand()/(double)(RAND_MAX));
雖然有時不必要,編譯器可以自動轉換操作人員根據目標和源變量類型另一種類型。爲例如:
3.5/2可以等於1,而不是1.75,因爲除數是一個整數,並避免這一點,必須做到:
3.5/2.0或3.5 /(雙)2
不,'3.5/2'永遠不會是'1';整數總是提升到浮點數,而不是相反。如果你不熟悉促銷規則,可能會使代碼稍微容易一些,但是這並不是必要的,除非你弄錯了,否則不會改變行爲。 –
好吧......可能是舊的多編譯器,沒有尊重規則,我從很長一段時間得到了這種恥辱:) –
是的,我相信隨後會產生一個隨機序列給你0和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;
}
((double)rand()*(max)/ RAND_MAX)具有完全相同的效果。然而,生成範圍[min,max]中的數字可以使用:(((double)rand()*(max - min)/ RAND_MAX)+ min) – JasoonS
是的,它似乎是正確的。 –
@ AbhishekBansal:謝謝!但是它會給我0和100%的1嗎?你確定? – nullpointer
刪除括號中的一半。它們是多餘的。 –