名稱空間
變體
操作

std::ranges::generate_random

來自 cppreference.com
< cpp‎ | 演算法‎ | 範圍
 
 
演算法庫
有約束演算法與針對範圍的演算法 (C++20)
有約束的演算法,例如 ranges::copyranges::sort 等……
執行策略 (C++17)
排序及相關操作
劃分操作
排序操作
二分搜尋操作
(於已劃分範圍上)
集合操作(於已排序範圍上)
歸併操作(於已排序範圍上)
堆操作
最小/最大值操作
(C++11)
(C++17)
字典序比較操作
排列操作
C 庫
數值操作
未初始化記憶體上的操作
 
受約束演算法
此選單中的所有名稱均屬於名稱空間 std::ranges
非修改序列操作
修改序列操作
劃分操作
排序操作
二分查詢操作(在已排序的範圍內)
       
       
集合操作(於已排序範圍上)
堆操作
最小/最大值操作
       
       
排列操作
摺疊操作
數值操作
(C++23)            
隨機數生成
generate_random
(C++26)
對未初始化儲存的操作
返回型別
 
定義於標頭檔案 <random>
呼叫簽名 (Call signature)
template< class R, class G >

    requires ranges::output_range<R, std::invoke_result_t<G&>> &&
             std::uniform_random_bit_generator<std::remove_cvref_t<G>>
constexpr ranges::borrowed_iterator_t<R>

    generate_random( R&& r, G&& g );
(1) (C++26 起)
template< class G, std::output_iterator<std::invoke_result_t<G&>> O,

          std::sentinel_for<O> S >
    requires std::uniform_random_bit_generator<std::remove_cvref_t<G>>
constexpr O

    generate_random( O first, S last, G&& g );
(2) (C++26 起)
template< class R, class G, class D >

    requires ranges::output_range<R, std::invoke_result_t<D&, G&>> &&
             std::invocable<D&, G&> &&
             std::uniform_random_bit_generator<std::remove_cvref_t<G>> &&
             std::is_arithmetic_v<std::invoke_result_t<D&, G&>>
constexpr ranges::borrowed_iterator_t<R>

    generate_random( R&& r, G&& g, D&& d );
(3) (C++26 起)
template< class G, class D, std::output_iterator<std::invoke_result_t<D&, G&>> O,

          std::sentinel_for<O> S >
    requires std::invocable<D&, G&> &&
             std::uniform_random_bit_generator<std::remove_cvref_t<G>> &&
             std::is_arithmetic_v<std::invoke_result_t<D&, G&>>
constexpr O

    generate_random( O first, S last, G&& g, D&& d );
(4) (C++26 起)

嘗試使用隨機數生成器或分佈的 `generate_random` 成員函式來生成隨機數,這預計會更高效。如果沒有 `generate_random` 成員函式可用,則回退到逐元素生成。

令回退操作分別為呼叫 ranges::generate(std::forward<R>(r), std::ref(g))ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) 用於 (1)(3)

1) 如果表示式 g.generate_random(std::forward<R>(r)) 形式良好,則呼叫它。
否則,令 Istd::invoke_result_t<G&>。如果 `R` 模擬 `sized_range`,則透過執行未指定次數的 g()g.generate_random(s) 形式的呼叫(如果對於值 `N` 和型別為 std::span<I, N> 的物件 s,這樣的表示式形式良好),用 ranges::size(r)I 型別的值填充 r
否則,執行回退操作。
3) 如果表示式 d.generate_random(std::forward<R>(r), g) 形式良好,則呼叫它。
否則,令 Istd::invoke_result_t<D&, G&>。如果 `R` 模擬 `sized_range`,則透過執行未指定次數的 std::invoke(d, g)d.generate_random(s, g) 形式的呼叫(如果對於值 `N` 和型別為 std::span<I, N> 的物件 s,這樣的表示式形式良好),用 ranges::size(r)I 型別的值填充 r
否則,執行回退操作。
2,4) 分別等價於 (1,3),其中 rranges::subrange<O, S>(std::move(first), last) 獲得。

如果 (1)(3) 的效果與相應的回退操作的效果不等價,則行為未定義。

N 的值在不同調用之間可能不同。對於較短的範圍,實現可以選擇較小的值。

本頁描述的類函式實體是 演算法函式物件(非正式地稱為 niebloids),即

目錄

[編輯] 引數

first, last - 定義要寫入隨機數的元素的範圍的迭代器-哨兵對
r - 要寫入隨機數的`範圍`
g - 統一隨機位生成器
d - 隨機數分佈物件

[編輯] 注意

在 `std::ranges::generate_random` 標準化時,標準庫中沒有提供 `generate_random` 成員函式的隨機數生成器或分佈。

當與包裝底層向量化 API 的使用者定義隨機數生成器一起使用時,`std::ranges::generate_random` 可以更高效。

特性測試 標準 特性
__cpp_lib_ranges_generate_random 202403L (C++26) std::ranges::generate_random

[編輯] 示例

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <random>
 
int main()
{
    std::default_random_engine eng;
    std::default_random_engine::result_type rs[16]{};
    std::ranges::generate_random(rs, eng);
 
    std::cout << std::left;
    for (int i{}; auto n : rs)
        std::cout << std::setw(11) << n << (++i % 4 ? ' ' : '\n');
}

可能的輸出

16807       282475249   1622650073  984943658 
1144108930  470211272   101027544   1457850878
1458777923  2007237709  823564440   1115438165
1784484492  74243042    114807987   1137522503

[編輯] 參閱

將一個函式的結果儲存在一個範圍中
(演算法函式物件)[編輯]
指定型別是否符合統一隨機位生成器
(概念) [編輯]