簡體   English   中英

實例化c ++ 11隨機設施的正確方法是什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM