13#ifndef ARCANE_CORE_RANDOM_UNIFORMONINT_H
14#define ARCANE_CORE_RANDOM_UNIFORMONINT_H
18#include "arcane/utils/FatalErrorException.h"
20#include "arcane/core/random/UniformSmallInt.h"
25namespace Arcane::random
54template<
class UniformRandomNumberGenerator,
class IntType =
int>
58 typedef UniformRandomNumberGenerator base_type;
59 typedef IntType result_type;
60 static const bool has_fixed_range =
false;
62 UniformInt(base_type & rng, IntType min, IntType max)
63 : _rng(rng), _min(min), _max(max), _range(_max - _min),
64 _bmin(_rng.min()), _brange(_rng.max() - _bmin)
66 if(utils::equal_signed_unsigned(_brange, _range))
67 _range_comparison = 0;
68 else if(utils::lessthan_signed_unsigned(_brange, _range))
69 _range_comparison = -1;
71 _range_comparison = 1;
73 result_type operator()();
74 result_type min()
const {
return _min; }
75 result_type max()
const {
return _max; }
77 typedef typename base_type::result_type base_result;
79 result_type _min, _max, _range;
80 base_result _bmin, _brange;
81 int _range_comparison;
84template<
class UniformRandomNumberGenerator,
class IntType>
85inline IntType UniformInt<UniformRandomNumberGenerator, IntType>::operator()()
87 if(_range_comparison == 0) {
90 return static_cast<result_type
>(_rng() - _bmin) + _min;
91 }
else if(_range_comparison < 0) {
97 if(_range == std::numeric_limits<result_type>::max()) {
98 limit = _range/(
static_cast<result_type
>(_brange)+1);
99 if(_range %
static_cast<result_type
>(_brange)+1 ==
static_cast<result_type
>(_brange))
102 limit = (_range+1)/(
static_cast<result_type
>(_brange)+1);
106 result_type result = 0;
107 result_type
mult = 1;
108 while(mult <= limit) {
109 result += (_rng() - _bmin) * mult;
110 mult *=
static_cast<result_type
>(_brange)+1;
118 return result + _min;
121 if(_brange / _range > 4 ) {
124 return UniformSmallInt<base_type,result_type>(_rng, _min, _max)();
128 base_result result = _rng() - _bmin;
131 if(result <=
static_cast<base_result
>(_range))
132 return result + _min;
void mult(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Multiplie terme à terme les éléments de l'instance par les éléments du tableau copy_array.