2017-07-15 67 views
1

我想用一個隨機數生成器來實現一些來自C++ 11 <random>庫的發行版。如何實現一個自己的發生器與std分佈一起使用

是否有我的生成器類必須遵守的接口,以便它的一個實例可以傳遞給分配的operator()方法?

還是有基礎班,我必須從中派生我的班?

+2

如果檢查的參考,它指出需要什麼:http://en.cppreference.com/w/cpp/concept/UniformRandomBitGenerator – UnholySheep

+0

聽起來好像你可能會將運行時調度通過接口與函數的編譯時綁定混淆。 Operator()在編譯時綁定到模板。 –

回答

1

你的接口有相匹配的UniformRandomBitGenerator概念:

+-----------------+--------------+-------------------------------------------------------------------------------------------------------+ 
| Expression  | Return type | Requirements                       | 
+-----------------+--------------+-------------------------------------------------------------------------------------------------------+ 
| G::result_type | T   | T is an unsigned integer type                   | 
| G::min()  | T   | Returns the smallest value that G's operator() may return. The value is strictly less than G::max(). | 
| G::max()  | T   | Returns the largest value that G's operator() may return. The value is strictly greater than G::min() | 
| g()    | T   | Returns a value in the closed interval [G::min(), G::max()]. Has amortized constant complexity.  | 
+-----------------+--------------+-------------------------------------------------------------------------------------------------------+ 

您不必從基類派生的綁定發生在編譯時。

這裏是發電機的接口相匹配的玩具例子:

#include <random> 
#include <iostream> 

class MyGen 
{ 
public: 
    using result_type = int; 
    static constexpr result_type min() { return 0; } 
    static constexpr result_type max() { return 99; } 
    result_type operator()() { return rand() % 100; } 
}; 

int main() 
{ 
    std::uniform_int_distribution<int> dist{1, 6}; 
    MyGen gen; 

    for(int i = 0; i < 10; i++) 
    std::cout << dist(gen) << '\n'; 

    return 0; 
} 
相關問題