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.