名前空間
変種
操作

std::ranges::generate_random

From cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
制約付きアルゴリズム
このメニューのすべての名前は名前空間 `std::ranges` に属します
シーケンスを変更しない操作
シーケンスを変更する操作
パーティション操作
ソート操作
二分探索操作 (ソート済み範囲)
       
       
集合操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
       
       
順列操作
畳み込み操作
数値演算
(C++23)            
乱数生成
generate_random
(C++26)
未初期化ストレージに対する操作
戻り値の型
 
ヘッダー <random> で定義
呼び出しシグネチャ
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, class O, std::output_iterator<std::invoke_result_t<G&>>,

          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` メンバ関数を呼び出して乱数を生成しようとします。これは、より効率的であることが期待されます。`generate_random` メンバ関数が利用できない場合は、要素ごとの生成にフォールバックします。

(1) または (3) において、フォールバック操作は、ranges::generate(std::forward<R>(r), std::ref(g))、または ranges::generate(std::forward<R>(r), [&d, &g] { return std::invoke(d, g); }) に相当します。

1) この式がwell-formedである場合、g.generate_random(std::forward<R>(r)) を呼び出します。
それ以外の場合、Istd::invoke_result_t<G&> とします。Rsized_range をモデルとする場合、ranges::size(r) 個の I 型の値を r に格納します。これは、g() または g.generate_random(s) の形式の呼び出しを、N という値と std::span<I, N> 型のオブジェクト s に対して、指定されていない回数だけ実行することによって行われます。
それ以外の場合、フォールバック操作を実行します。
3) この式がwell-formedである場合、d.generate_random(std::forward<R>(r), g) を呼び出します。
それ以外の場合、Istd::invoke_result_t<D&, G&> とします。Rsized_range をモデルとする場合、ranges::size(r) 個の I 型の値を r に格納します。これは、std::invoke(d, g) または d.generate_random(s, g) の形式の呼び出しを、N という値と std::span<I, N> 型のオブジェクト s に対して、指定されていない回数だけ実行することによって行われます。
それ以外の場合、フォールバック操作を実行します。
2,4) それぞれ (1,3) と同等です。ただし、rranges::subrange<O, S>(std::move(first), last) から取得されます。

(1) または (3) の効果が、対応するフォールバック操作の効果と同等でない場合、動作は未定義です。

N の値は呼び出しごとに異なる場合があります。実装では、短い範囲に対してより小さい値を選択することがあります。

このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、

目次

[編集] パラメータ

first, last - 乱数が書き込まれる要素の 範囲 を定義するイテレータ-センチネルペア
r - 乱数が書き込まれる 範囲
g - 一様乱数ビット生成器
d - 乱数分布オブジェクト

[編集] 注釈

std::ranges::generate_random の標準化の時点では、標準ライブラリには `generate_random` メンバ関数を提供する乱数生成器または分布は存在しません。

std::ranges::generate_random は、基盤となるベクトル化されたAPIをラップするユーザー定義の乱数生成器と使用する場合に、より効率的になる可能性があります。

機能テストマクロ 規格 機能
__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

[編集] 関連項目

関数の結果を範囲に保存する
(アルゴリズム関数オブジェクト)[編集]
型が一様乱数ビット生成器として適格であることを指定する
(コンセプト) [編集]
English 日本語 中文(简体) 中文(繁體)