std::ranges:: generate_random
           std::ranges
          
          | Non-modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modifying sequence operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Partitioning operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sorting operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Binary search operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Set operations (on sorted ranges) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Heap operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Minimum/maximum operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Permutation operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fold operations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized storage | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Return types | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
           Defined in header
            
            
             <random>
            
            | ||
| 
           Call signature
           | ||
| 
           
            
             template
            
            
             <
            
            
             class
            
            R,
            
             class
            
            G
            
             >
            
             
             requires
             
              
               ranges::
               
                output_range
               
              
             
             
              <
             
             R,
             
              
               std::
               
                invoke_result_t
               
              
             
             
              <
             
             G
             
              &
             
             
              >>
             
             
              &&
             
              | (1) | (since C++26) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            G,
            
             
              std::
              
               output_iterator
              
             
            
            
             <
            
            
             
              std::
              
               invoke_result_t
              
             
            
            
             <
            
            G
            
             &
            
            
             >>
            
            O,
             
             
              
               std::
               
                sentinel_for
               
              
             
             
              <
             
             O
             
              >
             
             S
             
              >
             
              | (2) | (since C++26) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            R,
            
             class
            
            G,
            
             class
            
            D
            
             >
            
             
             requires
             
              
               ranges::
               
                output_range
               
              
             
             
              <
             
             R,
             
              
               std::
               
                invoke_result_t
               
              
             
             
              <
             
             D
             
              &
             
             , G
             
              &
             
             
              >>
             
             
              &&
             
              | (3) | (since C++26) | 
| 
           
            
             template
            
            
             <
            
            
             class
            
            G,
            
             class
            
            D,
            
             
              std::
              
               output_iterator
              
             
            
            
             <
            
            
             
              std::
              
               invoke_result_t
              
             
            
            
             <
            
            D
            
             &
            
            , G
            
             &
            
            
             >>
            
            O,
             
             
              
               std::
               
                sentinel_for
               
              
             
             
              <
             
             O
             
              >
             
             S
             
              >
             
              | (4) | (since C++26) | 
       Attempts to generate random numbers with the
       
        generate_random
       
       member function of the random number generator or the distribution, which is expected to be more efficient. Falls back to element-wise generation if no
       
        generate_random
       
       member function is available.
      
Let fallback operation be calling ranges:: generate ( std:: forward < R > ( r ) , std:: ref ( g ) ) or ranges:: generate ( std:: forward < R > ( r ) , [ & d, & g ] { return std:: invoke ( d, g ) ; } ) for (1) or (3) respectively.
        R
       
       models
       
        
         sized_range
        
       
       , fills
       
        
         r
        
       
       with
       
        
         
          
           ranges::
           
            size
           
          
         
         
          (
         
         r
         
          )
         
        
       
       values of
       
        
         I
        
       
       by performing an unspecified number of invocations of the form
       
        
         g
         
          (
         
         
          )
         
        
       
       or
       
        
         g.
         
          generate_random
         
         
          (
         
         s
         
          )
         
        
       
       , if such an expression is well-formed for a value
       
        N
       
       and an object
       
        
         s
        
       
       of type
       
        
         
          
           std::
           
            span
           
          
         
         
          <
         
         I, N
         
          >
         
        
       
       .
      
        R
       
       models
       
        
         sized_range
        
       
       , fills
       
        
         r
        
       
       with
       
        
         
          
           ranges::
           
            size
           
          
         
         
          (
         
         r
         
          )
         
        
       
       values of type
       
        
         I
        
       
       by performing an unspecified number of invocations of the form
       
        
         
          
           std::
           
            invoke
           
          
         
         
          (
         
         d, g
         
          )
         
        
       
       or
       
        
         d.
         
          generate_random
         
         
          (
         
         s, g
         
          )
         
        
       
       , if such an expression is well-formed for a value
       
        N
       
       and an object
       
        
         s
        
       
       of type
       
        
         
          
           std::
           
            span
           
          
         
         
          <
         
         I, N
         
          >
         
        
       
       .
      If the effects of (1) or (3) are not equivalent to those of the corresponding fallback operation, the behavior is undefined.
       The value of
       
        N
       
       can differ between invocations. Implementations may select smaller values for shorter ranges.
      
The function-like entities described on this page are algorithm function objects (informally known as niebloids ), that is:
- Explicit template argument lists cannot be specified when calling any of them.
- None of them are visible to argument-dependent lookup .
- When any of them are found by normal unqualified lookup as the name to the left of the function-call operator, argument-dependent lookup is inhibited.
Parameters
| first, last | - | iterator-sentinel pair that denotes the range to which random numbers are written | 
| r | - | range to which random numbers are written | 
| g | - | uniform random bit generator | 
| d | - | random number distribution object | 
Notes
       At the time of the standardization of
       
        std::ranges::generate_random
       
       , there is no random number generator or distribution in the standard library that provides a
       
        generate_random
       
       member function.
      
       
        std::ranges::generate_random
       
       can be more efficient when used with a user-defined random number generator that wraps an underlying vectorized API.
      
| Feature-test macro | Value | Std | Feature | 
|---|---|---|---|
| 
           __cpp_lib_ranges_generate_random
           | 202403L | (C++26) | 
          std::ranges::generate_random
          | 
Example
#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'); }
Possible output:
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 823564440 1115438165 1784484492 74243042 114807987 1137522503
See also
| 
           
            
             
              (C++20)
             
            
           
           | saves the result of a function in a range (algorithm function object) | 
| 
           
            
             
              (C++20)
             
            
           
           | specifies that a type qualifies as a uniform random bit generator (concept) |