[英]Using c++11's <random> header, what is the correct way to get an integer between 0 and n?
[英]What is the correct way to instantiate c++11 random facilities
在查看了關於在C ++中使用新的“隨機”工具的各種示例之后,我對最佳實踐感到有些困惑 - 特別是與各種實例的生命周期有關。
例如,在一些示例中,“random_device”的使用在諸如函數的局部范圍中是靜態的,或者是靜態全局變量或者僅僅是本地的。
--- TU ---
static std::random_device global_source;
void foo()
{
static std::random_device local_static_source;
static std::mt19937 gen(local_static_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}
void boo()
{
std::mt19937 gen(global_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}
void roo()
{
std::random_device local_source;
std::mt19937 gen(local_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
}
int main()
{
static std::mt19937 gen(global_source());
std::uniform_int_distribution<> dist(0,10);
...
dist(gen);
...
return 0;
}
--- TU ---
Q1:如果多個線程可以訪問“foo”或“boo”,那么生成器和源是否可以是靜態的? - 有沒有像shared_ptr那樣的線程安全保證?
問題2:標准中是否有任何措辭可以討論與實例化相關的假設和問題?
一些背景:允許多個隨機數生成器實例的原因主要是線程安全性(不會增加帶有線程同步的隨機數生成器實現)和可重復性(允許使用相同的種子重復一系列數字)。
前者非常明顯 - 在性能關鍵代碼中使用RNG的有效案例。 如果有多個實例,則不需要昂貴的互斥鎖,並且可以在多個CPU內核上並行生成隨機數。
后者通過隨機生成數據集通常很有用。 作為一個常見的例子,視頻游戲可以通過從同一RNG(甚至可能在不同的聯網PC上)驅動與游戲世界的創建相關的所有決策來重建相同(隨機)游戲世界。
因此,C ++ RNG的最佳范圍取決於您所編寫的內容:
如果您正在編寫可能在上述場景的上下文中使用的庫 ,那么讓調用者為各個方法或類提供RNG可能是個好主意:
// Can be used on multiple CPU cores in parallel or with seed values
template <typename TRandomNumberEngine>
Point2 GetRandomPointInRectangle(
const Rectangle2 &rect, TRandomNumberEngine &random
) {
std::uniform_real_distribution<float> horizontal(rect.Min.X, rect.Max.X);
float x = horizontal(random);
std::uniform_real_distribution<float> vertical(rect.Min.Y, rect.Max.Y);
float y = vertical(random);
return Point2(x, y);
}
如果您正在編寫使用RNG作為支持角色的應用程序或庫(例如,幾何擬合算法),即。 您只對不可重復的隨機數感興趣,隨機數生成器的最佳范圍將是最大可能的范圍,不會在模塊之間引入不需要的耦合。
這可能是一個簡單的私有對象變量,無論什么類需要隨機數,甚至是一個thread_local
單例,如果它有很多短命的消費者可以證明這種復雜性,那么它就會提供你選擇的RNG。
分布(如std::uniform_real_distribution
)可以像你想要的那樣短暫。 它們是簡單的仿函數,其中構造函數要么沒有參數,要么只存儲仿函數執行時的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.