Arcane  4.2.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
IRandomNumberGenerator.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* IRandomNumberGenerator.h (C) 2000-2026 */
9/* */
10/* Interface pour le générateur de nombres aléatoires. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_IRANDOMNUMBERGENERATOR_H
13#define ARCANE_CORE_IRANDOMNUMBERGENERATOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
19
20#include <cstring>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31/**
32 * @brief Classe permettant de manipuler facilement une graine.
33 *
34 * Une graine est représentée par un tableau de Byte.
35 * Cette classe utilise un ArrayView de ce tableau.
36 *
37 * Cette classe permet de définir une valeur dans le tableau et
38 * de récupérer cette valeur (autres autres choses).
39 *
40 * Cette classe ne stocke pas le tableau mais uniquement
41 * un ArrayView de ce tableau.
42 *
43 */
44class ARCANE_CORE_EXPORT RNGSeedHelper
45{
46 public:
47
48 /**
49 * @brief Constructeur de la classe.
50 *
51 * @param av Un ArrayView de tableau représentant une graine.
52 */
54 {
55 m_seed = av;
56 }
57
58 /**
59 * @brief Constructeur de classe.
60 *
61 * @tparam T Un type de base.
62 * @param var Un pointeur vers la graine
63 * (attention, ne fait pas une copie de la valeur !)
64 */
65 template <class T>
67 {
68 m_seed = ByteArrayView(sizeof(T), (Byte*)var);
69 }
70
71 virtual ~RNGSeedHelper() = default;
72
73 public:
74
75 /**
76 * @brief Méthode permettant de définir une valeur dans la graine.
77 *
78 * @tparam T Le type de valeur.
79 * @param value_in La futur valeur de la graine.
80 * @return true Si la valeur a pu être attribuée.
81 * @return false Si la valeur n'a pas pu être attribuée.
82 */
83 template <class T>
84 bool setValue(T value_in)
85 {
86 if (m_seed.empty()) {
87 return false;
88 }
89 memcpy(m_seed.data(), &value_in, std::min(m_seed.size(), (Integer)sizeof(T)));
90 for (Integer i = sizeof(T); i < m_seed.size(); i++) {
91 m_seed[i] = 0x00;
92 }
93 return true;
94 }
95
96 /**
97 * @brief Méthode permettant de récupérer la valeur de la graine.
98 *
99 * @tparam T Le type de la graine.
100 * @param value_out [OUT] La valeur de la graine.
101 * @param without_size_check Si le rognage de la valeur est autorisé.
102 * @return true Si la valeur a pu être récupérée.
103 * @return false Si la valeur n'a pas pu être récupérée ou si le tableau
104 * a une taille nulle.
105 */
106 template <class T>
107 bool value(T& value_out, bool without_size_check = true) const
108 {
109 if (m_seed.empty() || (!without_size_check && sizeof(T) != m_seed.size())) {
110 return false;
111 }
112 value_out = 0;
113 std::memcpy(&value_out, m_seed.data(), std::min(m_seed.size(), (Integer)sizeof(T)));
114 return true;
115 }
116
117 /**
118 * @brief Méthode permettant de récupérer la valeur de la graine.
119 *
120 * @tparam T Le type de la graine.
121 * @param value_out [OUT] La valeur de la graine.
122 * @param without_size_check Si le rognage de la valeur est autorisé.
123 * @return true Si la valeur a pu être récupérée.
124 * @return false Si la valeur n'a pas pu être récupérée ou si le tableau
125 * a une taille nulle.
126 */
127 template <class T>
128 bool value(T* value_out, bool without_size_check = true) const
129 {
130 if (m_seed.empty() || (sizeof(T) != m_seed.size() && !without_size_check)) {
131 return false;
132 }
133 *value_out = 0;
134 memcpy(value_out, m_seed.data(), std::min(m_seed.size(), (Integer)sizeof(T)));
135 return true;
136 }
137
138 /**
139 * @brief Méthode permettant de récupérer la taille de la graine.
140 *
141 * @return Integer La taille de la graine (en octet).
142 */
144 {
145 return m_seed.size();
146 }
147
148 /**
149 * @brief Méthode permettant de récupérer une vue constante.
150 *
151 * @return ByteConstArrayView La vue.
152 */
154 {
155 return m_seed.constView();
156 }
157
158 /**
159 * @brief Méthode permettant de récupérer une vue.
160 *
161 * @return ByteArrayView La vue.
162 */
164 {
165 return m_seed;
166 }
167
168 /**
169 * @brief Opérateur de copie depuis une valeur de graine.
170 *
171 * @tparam T Le type de la graine.
172 * @param value La valeur de la graine.
173 * @return RNGSeedHelper& La graine destination.
174 */
175 template <class T>
177 {
178 setValue(new_value);
179 return *this;
180 }
181
182 /**
183 * @brief Méthode permettant de récupérer une copie du
184 * tableau de Byte.
185 *
186 * @return ByteUniqueArray La copie du tableau de Byte.
187 */
189 {
190 return ByteUniqueArray(m_seed);
191 }
192
193 protected:
194
195 ByteArrayView m_seed;
196};
197
198/**
199 * @ingroup StandardService
200 * @brief Interface pour un générateur de nombre aléatoire.
201 */
202class ARCANE_CORE_EXPORT IRandomNumberGenerator
203{
204 public:
205
206 virtual ~IRandomNumberGenerator() = default;
207
208 public:
209
210 /**
211 * @brief Méthode permettant d'initialiser le service.
212 *
213 * Avec la graine en option (ou la graine par défaut si l'on est
214 * en mode singleton).
215 *
216 * @return true Si l'initialisation a bien eu lieu.
217 * @return false Si l'initialisation n'a pas eu lieu.
218 */
219 virtual bool initSeed() = 0;
220
221 /**
222 * @brief Méthode permettant d'initialiser le service.
223 *
224 * Si la graine n'a pas la bonne taille, false sera retourné.
225 *
226 * @param seed La graine d'origine.
227 * @return true Si l'initialisation a bien eu lieu.
228 * @return false Si l'initialisation n'a pas eu lieu.
229 */
230 virtual bool initSeed(ByteArrayView seed) = 0;
231
232 /**
233 * @brief Méthode permettant de récupérer une vue constante sur la
234 * graine actuelle.
235 *
236 * @return ByteArrayView La graine.
237 */
239
240 /**
241 * @brief Méthode permettant de récupérer une graine vide de bonne taille.
242 *
243 * @return ByteUniqueArray La graine vide.
244 */
246
247 /**
248 * @brief Méthode permettant de connaitre la taille de seed nécessaire
249 * pour l'implémentation.
250 *
251 * @return Integer La taille de seed nécessaire (en octet).
252 */
254
255 /**
256 * @brief Méthode permettant de savoir si les sauts sont permis sur le
257 * générateur de graines.
258 *
259 * @return true Si oui.
260 * @return false Si non.
261 */
262 virtual bool isLeapSeedSupported() = 0;
263
264 /**
265 * @brief Méthode permettant de générer une graine "enfant" à partir d'une
266 * graine "parent".
267 *
268 * @param leap Le saut à effectuer (0 = la graine n+1+0 / 1 = la graine n+1+1).
269 * @return ByteUniqueArray La nouvelle graine généré à partir de la graine en mémoire.
270 */
272
273 /**
274 * @brief Méthode permettant de générer une graine "enfant" à partir d'une
275 * graine "parent".
276 *
277 * Cette méthode n'utilise pas la graine en mémoire mais la graine en paramètre.
278 * Si la graine en paramètre n'a pas la bonne taille, une erreur sera émise.
279 *
280 * @param parent_seed [IN/OUT] La graine "parent".
281 * @param leap Le saut à effectuer (0 = la graine n+1+0 / 1 = la graine n+1+1).
282 * @return ByteUniqueArray La nouvelle graine généré à partir de la graine "parent".
283 */
284 virtual ByteUniqueArray generateRandomSeed(ByteArrayView parent_seed, Integer leap = 0) = 0;
285
286 /**
287 * @brief Méthode permettant de savoir si les sauts sont permis sur le
288 * générateur de nombres.
289 *
290 * @return true Si oui.
291 * @return false Si non.
292 */
293 virtual bool isLeapNumberSupported() = 0;
294
295 /**
296 * @brief Méthode permettant de générer un nombre aléatoire avec
297 * la graine en mémoire.
298 *
299 * @param leap Le saut à effectuer (0 = le nombre n+1+0 / 1 = le nombre n+1+1).
300 * @return Real Le nombre généré (entre 0 et 1).
301 */
302 virtual Real generateRandomNumber(Integer leap = 0) = 0;
303
304 /**
305 * @brief Méthode permettant de générer un nombre aléatoire avec
306 * la graine transmise en paramètre.
307 *
308 * Cette méthode n'utilise pas la graine en mémoire mais la graine en paramètre.
309 * Si la graine en paramètre n'a pas la bonne taille, une erreur sera émise.
310 *
311 * @param seed [IN/OUT] La graine.
312 * @param leap Le saut à effectuer (0 = le nombre n+1+0 / 1 = le nombre n+1+1).
313 * @return Real Le nombre généré (entre 0 et 1).
314 */
315 virtual Real generateRandomNumber(ByteArrayView seed, Integer leap = 0) = 0;
316};
317
318/*---------------------------------------------------------------------------*/
319/*---------------------------------------------------------------------------*/
320
321} // End namespace Arcane
322
323/*---------------------------------------------------------------------------*/
324/*---------------------------------------------------------------------------*/
325
326#endif
Déclarations des types utilisés dans Arcane.
Interface pour un générateur de nombre aléatoire.
virtual ByteConstArrayView viewSeed()=0
Méthode permettant de récupérer une vue constante sur la graine actuelle.
virtual ByteUniqueArray emptySeed()=0
Méthode permettant de récupérer une graine vide de bonne taille.
virtual Real generateRandomNumber(ByteArrayView seed, Integer leap=0)=0
Méthode permettant de générer un nombre aléatoire avec la graine transmise en paramètre.
virtual ByteUniqueArray generateRandomSeed(Integer leap=0)=0
Méthode permettant de générer une graine "enfant" à partir d'une graine "parent".
virtual bool isLeapSeedSupported()=0
Méthode permettant de savoir si les sauts sont permis sur le générateur de graines.
virtual Real generateRandomNumber(Integer leap=0)=0
Méthode permettant de générer un nombre aléatoire avec la graine en mémoire.
virtual ByteUniqueArray generateRandomSeed(ByteArrayView parent_seed, Integer leap=0)=0
Méthode permettant de générer une graine "enfant" à partir d'une graine "parent".
virtual bool isLeapNumberSupported()=0
Méthode permettant de savoir si les sauts sont permis sur le générateur de nombres.
virtual bool initSeed(ByteArrayView seed)=0
Méthode permettant d'initialiser le service.
virtual Integer neededSizeOfSeed()=0
Méthode permettant de connaitre la taille de seed nécessaire pour l'implémentation.
virtual bool initSeed()=0
Méthode permettant d'initialiser le service.
Classe permettant de manipuler facilement une graine.
bool value(T &value_out, bool without_size_check=true) const
Méthode permettant de récupérer la valeur de la graine.
Integer sizeOfSeed() const
Méthode permettant de récupérer la taille de la graine.
bool setValue(T value_in)
Méthode permettant de définir une valeur dans la graine.
ByteConstArrayView constView() const
Méthode permettant de récupérer une vue constante.
ByteUniqueArray copy()
Méthode permettant de récupérer une copie du tableau de Byte.
bool value(T *value_out, bool without_size_check=true) const
Méthode permettant de récupérer la valeur de la graine.
ByteArrayView view()
Méthode permettant de récupérer une vue.
RNGSeedHelper(T *var)
Constructeur de classe.
RNGSeedHelper(ByteArrayView av)
Constructeur de la classe.
RNGSeedHelper & operator=(T new_value)
Opérateur de copie depuis une valeur de graine.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:445
Int32 Integer
Type représentant un entier.
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:333
double Real
Type représentant un réel.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:474
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:42