![](/img/trans.png)
[英]Safe random number generation using rand() or std::random_device in C++
[英]Generating random numbers in C++ using std::random_device
我使用以下代碼在C ++中生成隨機數
std::random_device rdev {};
std::default_random_engine generator {rdev()};
std::uniform_int_distribution dist {a, b};
相似地
std::default_random_engine generator {std::random_device{}()};
std::uniform_int_distribution dist {a, b};
我想了解的是使用種子值生成引擎的機制。 random_device使用來自操作系統的各種信息獲取種子。 此值用於初始化引擎對象。 對於此處顯示的第一段代碼,如果rdev
是一個對象,為什么我們將該值作為rdev()
傳遞給引擎。 為什么我們在類的對象上使用函數符號?
對於第二段代碼,我們如何僅使用類名就能生成std::random_device
對象?
我不確定我理解這個問題是否特定於隨機數生成或涉及C ++語言本身的更大問題。
std::random_device
對象本身不用作種子。 random_device
是一個真隨機數生成器。 調用其括號運算符可從中得到一個樣本。 不幸的是,生成真實的隨機數往往比生成偽隨機數更昂貴,因此,折衷方案傾向於生成單個真實的隨機數作為種子傳遞給偽隨機生成器。 因此,在您的第一個示例中,通過調用其括號運算符( rdev()
),對random_device
進行了一次采樣,返回了一個真正的隨機值,該值用作std::default_random_engine
對象的種子。
第二個示例做的事情完全相同,只是在這種情況下random_device
是臨時的。 在C ++中,您可以通過直接調用類的構造函數來構造臨時對象,在這種情況下,使用大括號初始化。 換句話說,表達式std::random_device{}
返回一個臨時的,默認構造的random_device
對象,然后像前面的示例一樣調用其括號運算符以產生種子。
std::random_device
重載括號運算符,使其具有類似函數的語法。 它或多或少看起來像這樣:
class random_device {
/*...*/
public:
uint32_t operator()() {
return /*...*/;
}
};
然后可以在對象上調用它
std::random_device device;
uint32_t value = device();
或在臨時對象(從技術上講仍然是對象)上
uint32_t value = std::random_device{}();
uint32_t value_2 = std::random_device()(); //Equivalent syntax
operator()
重載也可以通過其他方式重載。
struct multiplies_by_3 {
uint32_t operator()(uint32_t value) const {
return value * 3;
}
};
multiplies_by_3 multiplier;
uint32_t value = multiplier(15); //45
uint32_t value_2 = multiplies_by_3{}(20); //60
uint32_t value_3 = multiplies_by_3()(25); //75
struct subtracts_first_from_second {
uint32_t operator()(uint32_t first, uint32_t second) const {
return second - first;
}
};
subtracts_first_from_second subtractor;
uint32_t value = subtractor(15, 17); //2
uint32_t value_2 = subtracts_first_from_second{}(20, 29); //9
uint32_t value_3 = subtracts_first_from_second()(25, 17); //Underflows to some large number
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.