2015-02-04 67 views
2

我有問題想在一個結構中創建一個std::uniform_int_distribution,然後再給它的範圍。以下是我想要的。使用std :: uniform_int_distribution並稍後定義其範圍

#include <random> 
#include <iostream> 

std::random_device rd; 
std::mt19937 gen(rd()); 

struct group_s { 
    int k; 
    std::uniform_int_distribution<> dis; 
} group; 


int main() 
{ 
    group.dis(0,19); 
    std::cout << group.dis(gen) << ' '; 
} 

我收到以下錯誤:

no match for call to '(std::uniform_int_distribution<>) (int, int)' 
    cpu_group.dis(0,19); 

我該怎麼辦呢?

+0

可能性不大。該錯誤與您的代碼不符。 'gen'的定義也不受MVP的影響嗎? –

+1

@LightnessRacesinOrbit只有'rd'是一個類型名稱。 – Casey

回答

1

你可以做

group.dis = std::uniform_int_distribution<>(0,19); 

group.dis.param(std::uniform_int_distribution<>::param_type(0,19)); 

另一種方式是一種方法,添加到您的結構

struct group_s { 
    int k; 
    std::uniform_int_distribution<> dis; 
    void set(int a, int b) { dis = std::uniform_int_distribution<>(a,b); } 
} group; 


group.set(0,19); 
+0

或使用非靜態數據成員初始值設定項'std :: uniform_int_distribution <> dis = std :: uniform_int_distribution <> {0,19};' – Praetorian

+0

@Praetorian在C++ 11之前使用'std :: uniform_int_distribution'有點困難:) –

+0

@TC呵呵。有'tr1 /隨機'但是IIRC它被稱爲稍有不同的東西。 – Praetorian

0

你應該做

group.dis = std::uniform_int_distribution<>(0,19); 

代替

group.dis(0,19); 

而且,你的代碼似乎沒有采取直接從here參考,從而樣的tributal引文的鏈接會一直在爲。

+0

快速瀏覽一下cppreference沒有顯示爲'std :: uniform_int_distribution <>'保證的移動構造函數。你有沒有相反的證據? – Yakk

4

使用param()

using param_t = std::uniform_int_distribution<>::param_type; 

group.dis.param(param_t(0, 19)); 

如果參數更改每次使用分配的時間,那麼你也可以考慮使用的operator()雙參數過載,而不是:

std::cout << group.dis(gen, param_t(0, 19)) << ' '; 

分銷對象被允許存儲在以前的調用中獲得的額外的熵位,這種方法可以比構建新的分配對象並分配它更有效。

請注意,cppreference頁面不完整,並沒有記錄標準對param_type的要求。給定一個分佈型D及其相關param_typeP

For each of the constructors of D taking arguments corresponding to parameters of the distribution, P shall have a corresponding constructor subject to the same requirements and taking arguments identical in number, type, and default values. Moreover, for each of the member functions of D that return values corresponding to parameters of the distribution, P shall have a corresponding member function with the identical name, type, and semantics.

(§26.5.1.6[rand.req.dist]/P9)

+0

我很好奇,爲什麼'group.dis.param({0,19});'似乎不起作用。錯誤? 'std :: uniform_int_distribution <> {0,2}'似乎工作。 – Yakk

+0

@Yakk推測構造函數是'explicit',就像'std :: uniform_int_distribution'的構造函數採用兩個整數。 –