2017-04-03 50 views
2

當我看看std::exponential_distribution的文檔時,它似乎沒有公開在運行時更改lambda參數的標準方法。是否有文檔方式重置現有std :: exponential_distribution對象上的lambda參數?

有一個param方法,但它需要的不透光件類型param_type,而獲得這種類型的對象是調用param不帶參數的唯一記載的方式,但是這將意味着一個不同的實例必須首先經過用該參數創建。

下面,我展示了兩個重新編譯lambda的非文檔化方法,但我不知道它們是否會在運行時導致正確的行爲。

#include <random> 
#include <new> 

int main(){ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 
    std::exponential_distribution<double> intervalGenerator(5); 

    // How do we change lambda after creation? 
    // Construct a param_type using an undocumented constructor? 
    intervalGenerator.param(std::exponential_distribution<double>::param_type(7)); 

    // Destroy and recreate the distribution? 
    intervalGenerator.~exponential_distribution(); 
    new (&intervalGenerator) std::exponential_distribution<double>(9); 
} 

是否有文件的方式來做到這一點,如果沒有,要麼是兩種解決方案的安全使用?

+4

這不是無證的。始終可以使用與父分發相同的參數構造'param_type'。 – Praetorian

+0

@Praetorian,它的構造函數是否有文檔?我找不到任何東西。 – merlin2011

+3

「param_type」可以使用與其分佈相同的參數構造的事實是「RandomNumberDistribution」概念(26.5.1.6/9)的要求之一。 – Fanael

回答

5

一個新的發電機就分配到舊實例:

std::exponential_distribution<double> intervalGenerator(5); 
intervalGenerator = std::exponential_distribution<double>(7); 

便攜,易於閱讀,顯然是正確。


此外,

intervalGenerator.param(std::exponential_distribution<double>::param_type(7)); 

是安全的,因爲在這兩個N3337和N4141在26.5.1.6/9描述,這樣你就可以使用了。但是對於第一個變體,首先不會出現可移植性問題。

+0

我想盡量減少這種變化的開銷,並且我擔心爲額外的對象支付費用。看起來愚蠢的人必須拋棄該對象並創建一個全新的對象來重置參數。 – merlin2011

+2

@ merlin2011:[什麼額外的對象?](https://godbolt.org/g/HYa4Ni) – Fanael

+1

@ merlin2011不會有任何開銷。不要浪費你的時間猜測性能,在實際發現問題後進行優化。 –

相關問題