Bonjour, 

Envoyé par
e0x1n
Soit x = 400. Je voudrais générer aléatoirement 10 entiers dont les valeurs seraient comprises entre 20 et 60, et dont la somme totale serait égale à x.
Le but étant de produire plusieurs groupes de 10 nombres différents dont chacune des sommes est égale à x.
On peut trouver une réponse simple à l'énoncé en lui donnant une interprétation géométrique.
Il s'agit de trouver 10 nombres (pi) vérifiant
∑(pi) = 400 et 20 ≤ pi ≤ 60 ,
donc 10 nombres (qi) reliés aux précédents par la relation
pi = qi + 40
et vérifiant pour leur part:
∑(qi) = 0 et -20 ≤ pi ≤ 20 .
On envisage par conséquent 10 vecteurs constants (OMi) de même norme (R) et de résultante nulle, vérifiant par conséquent:
∑(OMi) = 0 (vecteur nul) et ║OMi]║ = R
ainsi qu'un point aléatoire situé à la distance (R) de l'origine du repère, et soumis quand à lui à la condition:
║OM║ = R .
Les produits scalaires correspondants qi = (OM│OMi) = R2Cos(θi)
vérifient bien les conditions attendues si l'on prend R = 201/2 :
∑(qi) = ∑(OM│OMi) = OM│∑(OMi) = OM│0 = 0 , -R2 = -20 ≤ qi ≤ R2 = 20 .
# Pour ce qui est de l'aspect aléatoire, on peut travailler
a) en dimension 2 en se basant sur les vecteurs position des sommets d'un décagone régulier inscrit dans le cercle de rayon (R) centré à l'origine (O) du repère, et admettant pour composantes:
OMi = R*Cos(i*π/5).ux + R*Sin(i*π/5).uy ;
on prendra pour le point aléatoire:
OM = R*Cos(θ).ux + R*Sin(θ).uy , avec θ = (2π)*Random ;
b) en dimension 3 en partant d'un polyèdre inscrit dans une sphère de rayon (R) centrée en (O), par exemple l'antiprisme à base carrée et à deux faces pointées, l'hexadécaèdre de sommets:
1 2 3 4 5 6 7 8 9 10
| R 0 0
-R 0 0
g 0 h
0 g h
-g 0 h
0 -g h
g' g' -h
-g' g' -h
-g' -g' -h
g' -g' -h |
avec g = (R2 - h2)1/2 et g' = g/21/2 ;
Il faudra tirer un point quelconque (M) de la sphère de rayon (R) avec une probabilité surfacique uniforme, par exemple par les instructions:
1 2 3 4 5
| REPEAT
u:= 2*Random - 1; v:= 2*Random - 1; w:= 2*Random - 1;
s:= Sqr(u) + Sqr(v) + Sqr(w);
UNTIL (0.01 < s) AND (s<1);
r:= R/Sqrt(s); x:= r*u; y:= r*v; z:= r*w; |
Le procédé conduisant à des nombres réels, on pourra passer aux entiers par une fonction d'arrondi; une somme éventuellement non-nulle sera éventuellement corrigée par modification de l'un des termes.
Les maths, ça peut encore servir de temps en temps quoi qu'on dise
Partager