2016-10-01 60 views
1

假設您正在開發一個需要隨機數的(嚴重)項目。實現自己的隨機函數是否被普遍接受? (C++)

線,如:

int num = rand() % 6 + 5; //random number between 5 - 10 

的(顯然)不會出現在那裏。 C++ 11頭文件<random>毫無疑問地勝過了這個舊的C-Style。

std::random_device rd; 
std::mt19937 engine(rd()); 
std::uniform_int_distribution<int> generate(5, 10); 
int num = generate(engine); 

但在一組工作時,我可以看到2個問題,這梅索德:

  • 的語法怪異,難以閱讀。

  • 這對於這樣一個經常很簡單的任務來說太複雜了。

所以這將是非常好的,有一個功能(在此基礎上梅索德)看起來像這樣:

int getRandom(int range_begin, int range_end); 

就我而言,不存在這樣的STL功能。所以我要求你的經驗:自己實現這個功能可以嗎?也許導出到一個單獨的標題,然後重載它的雙打和浮動等 我問這個問題,因爲在這個現代的C++時間,它是標準的使用STL函數,這是一種情況,語法實際上迫使你實現在你自己的。感謝您的幫助&在這個主題上的經驗。

編輯:最後我問,這樣的實現總是會在任何處理隨機數的項目中發生(遲早)。

+13

你不需要任何人的許可來實現一個功能。 –

回答

4

C++的關鍵目標之一是使寫域特定的抽象變得容易;如果您正在編寫使用特定形式的隨機數生成的代碼,通過所有方法將其封裝在適當的函數中。

+1

+1,實際上,這只是編程中的常識,並非針對RNG - 如果您編寫的代碼始終執行相同的任務代碼,那麼通過所有方法將其封裝在適當的函數中。 –

1

TS 2中有randint,但它可能不會成爲C++ 17。

因此,現在如果您不能/不會使用<experimental/...>,那麼實施您自己的解決方案是有意義的。考慮使用thread_local引擎。

int getRandom(int range_begin, int range_end) 
{ 
    thread_local std::mt19937 engine(std::random_device{}()); 
    std::uniform_int_distribution<int> generate(range_begin, range_end); 
    return generate(engine); 
} 

它仍然初始化engine與大多數架構只有32隨機性位,但這很可能是夠你。