Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::ranges...rate_random(3)  C++ Standard Libary std::ranges...rate_random(3)

NAME
       std::ranges::generate_random - std::ranges::generate_random

Synopsis
	  Defined in header <random>
	  Call signature
	  template< class R, class G >

	      requires	ranges::output_range<R,	 std::invoke_result_t<G&>>  &&
       (since
		       std::uniform_random_bit_generator<std::re-
       move_cvref_t<G>>	  (1) C++26)
	  constexpr ranges::borrowed_iterator_t<R>

	      generate_random( R&& r, G&& g );
	  template< class G, std::output_iterator<std::invoke_result_t<G&>> O,

		    std::sentinel_for<O>		  S		     >
       (since
	      requires		    std::uniform_random_bit_generator<std::re-
       move_cvref_t<G>>	  (2) C++26)
	  constexpr O

	      generate_random( O first,	S last,	G&& g );
	  template< class R, class G, class D >

	      requires ranges::output_range<R,	std::invoke_result_t<D&,  G&>>
       &&
		       std::invocable<D&,		 G&>		    &&
       (3) (since
		       std::uniform_random_bit_generator<std::re-
       move_cvref_t<G>>	      C++26)
	  constexpr ranges::borrowed_iterator_t<R>

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

		    std::sentinel_for<O>		  S		     >
       (since
	      requires		 std::invocable<D&,	      G&>	    &&
       (4) C++26)
		       std::uniform_random_bit_generator<std::re-
       move_cvref_t<G>>
	  constexpr O

	      generate_random( O first,	S last,	G&& g, D&& d );

	  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::for-
       ward<R>(r), std::ref(g))
	  or  ranges::generate(std::forward<R>(r),  [&d, &g] { return std::in-
       voke(d, g); }) for
	  (1) or (3) respectively.

	  1) Calls g.generate_random(std::forward<R>(r)) if this expression is
       well-formed.
	  Otherwise,  let  I  be   std::invoke_result_t<G&>.   If   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>.
	  Otherwise, performs the fallback operation.
	  3) Calls d.generate_random(std::forward<R>(r), g) if this expression
       is well-formed.
	  Otherwise, let  I  be	 std::invoke_result_t<D&,  G&>.	 If  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>.
	  Otherwise, performs the fallback operation.
	  2,4) Equivalent to (1,3) respectively,  where	 r  is	obtained  from
       ranges::subrange<O,
	  S>(std::move(first), last).

	  If the effects of (1)	or (3) are not equivalent to those of the cor-
       responding
	  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  niebloids,
       that is:

	    *  Explicit	template argument lists	cannot be specified when call-
       ing 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 in-
       hibited.

	  In practice, they may	be implemented as function  objects,  or  with
       special compiler
	  extensions.

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::gener-
       ate_random

Example
       // Run this code

	#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
	  ranges::generate		saves  the  result  of a function in a
       range
	  (C++20)		       (niebloid)
	  uniform_random_bit_generator specifies that a	type  qualifies	 as  a
       uniform random bit
	  (C++20)		       generator
				       (concept)

http://cppreference.com		  2024.06.10	  std::ranges...rate_random(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::ranges::generate_random&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help