Title
UniformRandomBitGenerator should validate min and max
Status
c++20
Section
[rand.req.urng]
Submitter
Casey Carter

Created on 2018-08-09.00:00:00 last changed 46 months ago

Messages

Date: 2020-02-14.15:01:42

Proposed resolution:

This wording is relative to N4849.

  1. Modify [rand.req.urng] as follows:

    1 A uniform random bit generator g of type G is a function object returning unsigned integer values such that each value in the range of possible results has (ideally) equal probability of being returned. [Note: The degree to which g's results approximate the ideal is often determined statistically.—end note]

    template<class G>
      concept uniform_random_bit_generator =
        invocable<G&> && unsigned_integral<invoke_result_t<G&>> &&
        requires {
          { G::min() } -> same_as<invoke_result_t<G&>>;
          { G::max() } -> same_as<invoke_result_t<G&>>;
          requires bool_constant<(G::min() < G::max())>::value;
        };
    

    -2- Let g be an object of type G. G models uniform_random_bit_generator only if

    (2.1) — both G​::​min() and G​::​max() are constant expressions ([expr.const]),

    (2.2) — G​::​min() < G​::​max(),

    (2.3) — G​::​min() <= g(),

    (2.4) — g() <= G​::​max(), and

    (2.5) — g() has amortized constant complexity.

    3 A class G meets the uniform random bit generator requirements if G models uniform_random_bit_generator, invoke_­result_­t<G&> is an unsigned integer type ([basic.fundamental]), and G provides a nested typedef-name result_­type that denotes the same type as invoke_­result_­t<G&>.

Date: 2020-02-14.15:01:42

[ 2020-02 Status to Immediate on Thursday night in Prague. ]

Date: 2020-02-15.00:00:00

[ 2020-02-13; Prague ]

LWG provided some improved wording.

Date: 2018-08-20.00:00:00

[ 2018-08-20 Priority set to 3 after reflector discussion ]

Previous resolution [SUPERSEDED]:

This wording is relative to N4791.

  1. Modify [rand.req.urng] as follows:

    1 A uniform random bit generator g of type G is a function object returning unsigned integer values such that each value in the range of possible results has (ideally) equal probability of being returned. [Note: The degree to which g's results approximate the ideal is often determined statistically.—end note]

    template<auto> struct require-constant; // exposition-only
    
    template<class G>
      concept UniformRandomBitGenerator =
        Invocable<G&> && UnsignedIntegral<invoke_result_t<G&>> &&
        requires {
          { G::min() } -> Same<invoke_result_t<G&>>;
          { G::max() } -> Same<invoke_result_t<G&>>;
          typename require-constant<G::min()>;
          typename require-constant<G::max()>;
          requires G::min() < G::max();
        };
    

    2 Let g be an object of type G. G models UniformRandomBitGenerator only if

    (2.1) — both G​::​min() and G​::​max() are constant expressions ([expr.const]),

    (2.2) — G​::​min() < G​::​max(),

    (2.3) — G​::​min() <= g(),

    (2.4) — g() <= G​::​max(), and

    (2.5) — g() has amortized constant complexity.

    3 A class G meets the uniform random bit generator requirements if G models UniformRandomBitGenerator, invoke_­result_­t<G&> is an unsigned integer type ([basic.fundamental]), and G provides a nested typedef-name result_­type that denotes the same type as invoke_­result_­t<G&>.

Date: 2018-08-09.00:00:00

[rand.req.urng] paragraph 2 specifies axioms for the UniformRandomBitGenerator concept:

2 Let g be an object of type G. G models UniformRandomBitGenerator only if

(2.1) — both G::min() and G::max() are constant expressions ([expr.const]),

(2.2) — G::min() < G::max(),

(2.3) — G::min() <= g(),

(2.4) — g() <= G::max(), and

(2.5) — g() has amortized constant complexity.

Bullets 2.1 and 2.2 are both compile-time requirements that ought to be validated by the concept.

History
Date User Action Args
2021-02-25 10:48:01adminsetstatus: wp -> c++20
2020-02-24 16:02:59adminsetstatus: immediate -> wp
2020-02-14 15:01:42adminsetmessages: + msg11125
2020-02-14 15:01:42adminsetstatus: new -> immediate
2020-02-13 20:13:47adminsetmessages: + msg11084
2018-08-20 12:41:52adminsetmessages: + msg10079
2018-08-09 00:00:00admincreate
2018-08-08 23:43:13adminsetmessages: + msg10055