Sign in Join
Wiki copytemporary

Generating Random Numbers/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<figure>
2-<img src="fpc_source_logo.png" title="fpc_source_logo.png" />
3-<figcaption>fpc_source_logo.png</figcaption>
4-</figure>
1+![](/wiki-images/8/84/Fpc_source_logo.png)
52
63(Ndt : quelques réserves sur la traduction, n'étant pas spécialiste)
74
85Les **nombres aléatoires** sont une importante ressource pour les applications scientifiques, l'éducation, le développement de jeu et la visualisation. Ils jouent un rôle clé dans la simulation scientifique.
96
107les nombres aléatoires générés par des algorithmes sont des nombres pseudo-aléatoires. Ils appartiennent à un (large) ensemble de nombres répétitifs, en une suite qui est impossible ou au moins difficilement prédictible. Contrairement à Delphi, Free Pascal utilise un algorithme MersenneTwister pour sa fonction standard [[doc:rtl/system/random.html|random]] comme définie dans la [[RTL/fr|RTL]]. Avant sa première utilisation, le générateur de nombres aléatoires doit être initialisé avec un simple appel à la fonction [[doc:rtl/system/randomize.html|randomize]], laquelle mets la graine du générateur. De préférence, cela est fait à la phase de lancement du programme.
118
129Alternativement, dans les systèmes basés sur Linux et Unix, les périphériques virtuels [[Dev random|/dev/random]] et `/dev/urandom` sont disponibles. Ils générent des nombres (pseudo) aléatoires basés sur le matériel.
1310
1411Une troisième option est d'utiliser des nombres aléatoires depuis une source externe, comme des périphériques spécialisés ou depuis des sources publiques, p.ex. basées sur des données de désintégration nucléaire.
1512
1613## Loi uniforme
1714
1815La loi uniforme (aussi appelée loi rectangulaire) représente une famille de loi de probabilité symétriques. Là, pour chaque membre de la famille, tous les intervalles de même longueur sur le support de la loi sont également probable.
1916
2017La fonction standard [[RTL/fr|RTL]] [[doc:rtl/system/random.html|random]] génère des nombres aléatoires qui remplissent une loi uniforme. Si appelée sans paramètre, `random` délivre un nombre flottant pseudo-aléatoire dans l'intervalle \[0,1\[ (i.e. 0 \<= result \< 1). Si `random` est appelée avec un argument Longint L, elle délivre un Longint aléatoire dans l'intervalle \[0, L\[. Pour créer des nombres aléatoires, d'autres algorithmes de loi spéciales sont nécessaires.
2118
2219## Loi Normale (gaussienne)
2320
2421Un des algorithmes les plus courants pour produire des nombres aléatoires normalement distribués depuis des nombres aléatoires uniformément distribués est [l'approche de Box-Müller](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Box-Muller). La fonction suivante calcule des nombres aléatoires selon une distribution gaussienne :
2522
2623``` pascal
2724 function rnorm (mean, sd: real): real;
2825 {Calculates Gaussian random numbers according to the Box-Müller approach}
2926 var
3027 u1, u2: real;
3128 begin
3229 u1 := random;
3330 u2 := random;
3431 rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);
3532 end;
3633```
3734
3835Le même algorithme est utilisé par la fonction [[doc:rtl/math/randg.html|randg]] de l'unité [[RTL/fr|RTL]] [[doc:rtl/math/index.html|math]] :
3936
4037``` pascal
4138function randg(mean,stddev: float): float;
4239```
4340
4441## Loi Exponentielle
4542
4643Une loi exponentielle se rencontre souvent dans les problèmes du monde réel. Un exemple classique est la distribution des temps d'attente entre des événements Poisson-aléatoire indépendants, p.ex. la désintégration radioactive des noyaux \[Press et al. 1989\].
4744
4845La fonction suivante délivre un nombre aléatoire en réel à partir de la loi exponentielle. *Rate* est l'inverse de la moyenne, et la constante *RESOLUTION* détermine la granularité des nombres aléatoires générés.
4946
5047``` pascal
5148function randomExp(a, rate: real): real;
5249const
5350 RESOLUTION = 1000;
5451var
5552 unif: real;
5653begin
5754 if rate = 0 then
5855 randomExp := NaN
5956 else
6057 begin
6158 repeat
6259 unif := random(RESOLUTION) / RESOLUTION;
6360 until unif <> 0;
6461 randomExp := a - rate * ln(unif);
6562 end;
6663end;
6764```
6865
6966## Loi Gamma
7067
7168La loi gamma est une famille à deux paramètres de distributions aléatoires continues. C'est une généralisation à la fois de la loi exponentielle et de la loi d'Erlang. Les applications possibles de la loi gamma incluent la modélisation et la simulation des files d'attente et la science actuarielle.
7269
7370La fonction suivante délivre un nombre aléatoire réel à partir d'une gamma. La structure de la distribution est définie par les paramètres *a*, *b* et *c*. La fonction fait usage de la fonction **randomExp** définie ci-dessus.
7471
7572``` pascal
7673function randomGamma(a, b, c: real): real;
7774const
7875 RESOLUTION = 1000;
7976 T = 4.5;
8077 D = 1 + ln(T);
8178var
8279 unif: real;
8380 A2, B2, C2, Q, p, y: real;
8481 p1, p2, v, w, z: real;
8582 found: boolean;
8683begin
8784 A2 := 1 / sqrt(2 * c - 1);
8885 B2 := c - ln(4);
8986 Q := c + 1 / A2;
9087 C2 := 1 + c / exp(1);
9188 found := False;
9289 if c < 1 then
9390 begin
9491 repeat
9592 repeat
9693 unif := random(RESOLUTION) / RESOLUTION;
9794 until unif > 0;
9895 p := C2 * unif;
9996 if p > 1 then
10097 begin
10198 repeat
10299 unif := random(RESOLUTION) / RESOLUTION;
103100 until unif > 0;
104101 y := -ln((C2 - p) / c);
105102 if unif <= power(y, c - 1) then
106103 begin
107104 randomGamma := a + b * y;
108105 found := True;
109106 end;
110107 end
111108 else
112109 begin
113110 y := power(p, 1 / c);
114111 if unif <= exp(-y) then
115112 begin
116113 randomGamma := a + b * y;
117114 found := True;
118115 end;
119116 end;
120117 until found;
121118 end
122119 else if c = 1 then
123120 { Gamma distribution becomes exponential distribution, if c = 1 }
124121 begin
125122 randomGamma := randomExp(a, b);
126123 end
127124 else
128125 begin
129126 repeat
130127 repeat
131128 p1 := random(RESOLUTION) / RESOLUTION;
132129 until p1 > 0;
133130 repeat
134131 p2 := random(RESOLUTION) / RESOLUTION;
135132 until p2 > 0;
136133 v := A2 * ln(p1 / (1 - p1));
137134 y := c * exp(v);
138135 z := p1 * p1 * p2;
139136 w := B2 + Q * v - y;
140137 if (w + D - T * z >= 0) or (w >= ln(z)) then
141138 begin
142139 randomGamma := a + b * y;
143140 found := True;
144141 end;
145142 until found;
146143 end;
147144end;
148145```
149146
150147## Loi d'Erlang
151148
152149La loi d'Erlang est une famille à deux paramètres de distributions de probabilité continues. C'est une généralisation de la loi exponentielle et un cas particulier de la loi gamma, où *c* est un entier. L loi d'Erlang La loi d'Erlang a été décrite d'abord par [Agner Krarup Erlang](https://fr.wikipedia.org/wiki/Agner_Krarup_Erlang) en vue de modéliser le délai entre des appels téléphoniques. Elle est utilisée dans la théorie des files d'attente et pour simuler les files d'attente.
153150
154151``` pascal
155152 function randomErlang(mean: real; k: integer): real;
156153 const
157154 RESOLUTION = 1000;
158155 var
159156 i: integer;
160157 unif, prod: real;
161158 begin
162159 if (mean <= 0) or (k < 1) then
163160 randomErlang := NaN
164161 else
165162 begin
166163 prod := 1;
167164 for i := 1 to k do
168165 begin
169166 repeat
170167 unif := random(RESOLUTION) / RESOLUTION;
171168 until unif <> 0;
172169 prod := prod * unif;
173170 end;
174171 randomErlang := -mean * ln(prod);
175172 end;
176173 end;
177174```
178175
179176## Loi de Poisson
180177
181178La loi de Poisson s'applique aux valeurs entières. Elle représente la probabilité de *k* succès, quand la probabilité de réussite à chaque essai est petite et le taux d'occurrences (la valeur mpoyenne) est constant.
182179
183180``` pascal
184181function randomPoisson(mean: integer): integer;
185182{ Generator for Poisson distribution (Donald Knuth's algorithm) }
186183const
187184 RESOLUTION = 1000;
188185var
189186 k: integer;
190187 b, l: real;
191188begin
192189 assert(mean > 0, 'mean < 1');
193190 k := 0;
194191 b := 1;
195192 l := exp(-mean);
196193 while b > l do
197194 begin
198195 k := k + 1;
199196 b := b * random(RESOLUTION) / RESOLUTION;
200197 end;
201198 randomPoisson := k - 1;
202199end;
203200```
204201
205202## Loi t
206203
207204La loi t (également appelée loi t de Student, puisqu'elle a été publiée par William Sealy Gosset en 1908 sous le pseudonyme *Student*) est une loi de probabilité continue. Sa structure est définie par un paramètre, le degré de liberté (*df*). En statistiques, plusieurs estimateurs sont t-distribués. Donc, la loi t de Student joue un rôle majeur dans nombre d'analyses statistiques largement utilisées, incluant le t-test de Student pour évaluer l'importance statistique de la différence entre deux moyennes d'échantillonnage, la construction d'intervalle de confiance pour la différence entre deux moyennes de population et dans les analyses de régression linéaire. La loi t surgit aussi dans l'analyse de donnée bayésienne d'une famille normale.
208205
209206L'algorithme suivant dépend de la fonction [[doc:rtl/system/random.html|random]] de la [[RTL/fr|RTL]] et de la fonction **randomChisq**.
210207
211208``` pascal
212209function randomT(df: integer): real;
213210{ Generator for Student's t distribution }
214211begin
215212 if df < 1 then randomT := NaN
216213 else
217214 begin
218215 randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
219216 end;
220217end;
221218```
222219
223220## Loi Chi carré
224221
225222La loi Chi carré est une loi continue de nombres aléatoires avec *df* degrés de liberté. C'est la loi de la somme des carrés de *df* variables aléatoires normal standard indépendantes. La loi Chi carré a de nombreuses applications en statistiques inférentielles, p.ex. dans l'estimation de la variance et pour les tests chi-carré. C'est une loi gamma spéciale avec *c* = *df*/ 2 et *b* = 2. Donc, la fonction suivante dépend de la fonction **randomGamma**.
226223
227224``` pascal
228225function randomChisq(df: integer): real;
229226begin
230227 if df < 1 then randomChisq := NaN
231228 else
232229 randomChisq := randomGamma(0, 2, 0.5 * df);
233230end;
234231```
235232
236233## Loi F
237234
238235La loi F, appelée aussi loi Fisher-Snedecor, est un loi de probabilité continue. Elle est utilisée pour le test F et l'ANOVA. Elle a deux degrés de liberté qui serve de paramètre de structure *v* et *w* qui sont des entiers positifs. La fonction suivante **randomF** fait usage de **randomChisq**.
239236
240237``` pascal
241238function randomF(v, w: integer): real;
242239begin
243240 if (v < 1) or (w < 1) then
244241 randomF := NaN
245242 else
246243 randomF := randomChisq(v) / v / (randomChisq(w) / w);
247244end;
248245```
249246
250247## Voir aussi
251248
252249- [[Dev random/fr|Dev random]]
253250- [[Functions for descriptive statistics/fr|Fonctions pour la statistique descriptive]]
254251
255252## Références
256253
257254(non traduit...)
258255
2592561. [G. E. P. Box and Mervin E. Muller, *A Note on the Generation of Random Normal Deviates*, The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610–611](http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.aoms/1177706645)
2602572. Dietrich, J. W. (2002). [Der Hypophysen-Schilddrüsen-Regelkreis](http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis). Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.
2612583. Press, W. H., B. P. Flannery, S. A. Teukolsky, W. T. Vetterling (1989). [Numerical Recipes in Pascal](http://openlibrary.org/works/OL16807779W/). The Art of Scientific Computing, Cambridge University Press, ISBN 0-521-37516-9.
2622594. Richard Saucier, [Computer Generation of Statistical Distributions](http://ftp.arl.mil/random/random.pdf), ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.
2632605. R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, [DOI 10.1007/978-1-4471-2993-6_2](http://dx.doi.org/10.1007/978-1-4471-2993-6_2), © Springer-Verlag London Limited 2012
2642616. Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007
265-
266-\
267262
268263---
269264*From the Free Pascal wiki, page "Generating Random Numbers/fr", as it stood on 2020-02-16 after a change by GAN, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history