Fonction aléatoire sans la fonction RND
Bonjour,
Je cherche a obtenir un nombre aleatoire equiprobable, entre -10 et +10 (des entiers au pas de 0.5 : -10;-9.5;-9;...;+9;+9.5;+10) SANS utiliser la fonction random .
Je suis perdu sur la determination des coef de cette formule : Un+1 = ( a * Un + b ) % c
Avez-vous des idées ?
Fonction aléatoire sans la fonction RND
Bonjour, :)
Les réponses apportées sont quelque peu déroutantes, et je ne dois pas être le seul dans l'embarras ...
Citation:
Envoyé par
tbc92
Et pour qu'on apprenne un peu, tu peux partager ce que tu as fait. Parce que je n'ai rien vu ici qui permettrait de générer une fonction random.
D'abord les liens cités:
Citation:
Envoyé par
DonQuiche
... Il existe de très nombreux algorithmes pour ça. Le standard est le
Mersenne Twister. Tu peux aussi utiliser "Xorshift1024*"
L'intérêt de ces articles est incontestable, mais faut-il d'emblée propulser le demandeur à des altitudes stratosphériques, en lui proposant des textes qui ne sont compréhensibles, en première lecture, qu'à des spécialistes de haut niveau (dont je ne fais pas partie) ?
Il semble que l'auteur de la question cherche seulement à s'initier à l'utilisation du générateur congruentiel linéaire ...
Citation:
Envoyé par
macErmite
... Je cherche à obtenir un nombre aléatoire équiprobable, entre -10 et +10 (des entiers au pas de 0.5 : -10;-9.5;-9;...;+9;+9.5;+10) SANS utiliser la fonction random .
Je suis perdu sur la détermination des coef de cette formule : Un+1 = ( a * Un + b ) % c
Avez-vous des idées ?
... et (sans que les liens précités soient exclus !) la documentation suivante lui serait probablement plus utile :
# Produire des Nombres au Hasard
http://www.alrj.org/docs/algo/random.php
# Générateur de nombres pseudo-aléatoires
https://fr.wikipedia.org/wiki/G%C3%A...l%C3%A9atoires
# Nombres pseudo-aléatoires
http://math.univ-lyon1.fr/~jberard/genunif-www.pdf
# Méthodes de Monte Carlo
http://www.ressources-actuarielles.net/EXT/ISFA/fp-isfa.nsf/2b0481298458b3d1c1256f8a0024c478/767ceb7e2d32524ec125710b0047fcef/$FILE/poly-ensai-mc.pdf
Quant aux calculs ... du passé faisons allègrement table rase :aie: Tant pis pour les engueulades.
1°) La liste des 41 valeurs entières et semi-entières consécutives allant de -10 à +10 s'exprime en fonction des 41 premiers entiers positifs par la relation affine: g = (m - 21)/2 . On passe ainsi à une variable aléatoire entière du domaine [1 ... 41] .
2°) L'entier premier immédiatement supérieur est N = 43, lequel admet 12 racines primitives (a):
{ 3 , 5 , 12 , 18 , 19 , 20 , 26 , 28 , 29 , 30 , 33 , 34 }
à chacune desquelles correspond une suite géométrique modulaire de la forme: vk+1 = a * vk mod (N) , de période N - 1 = 42 , et dont toutes les valeurs successives se situent dans [1 ... 42].
Il suffira donc de partir de la graine v0 = 42 pour obtenir ensuite toutes les valeurs utiles appartenant au domaine [1 ... 41] .
Le zéro, solution stationnaire ici exclue de la liste, doit sa particularité au choix simplificateur de la seconde constante de l'énoncé (b = 0), qui ne dénature en rien le problème. Envisager par la suite (b>0) conduit en première approximation à une permutation des termes de la suite.
3°) L'aspect aléatoire de la suite obtenue exige une dispersion convenable dans le plan des points de coordonnées (xk = vk , yk = vk+1 ) ; or ces points appartiennent à un réseau ponctuel plan dont la maille est construite sur deux vecteurs indépendants (U1, U2), dont les normes (U1, U2) représentent les plus courtes distances séparant les points du réseau, et qui vérifient par convention:
(a) 0 < U1 < U2 (b) U1x > 0 ; U2y > 0 (c) Det(U1, U2) > 0 .
La recherche des plus courts vecteurs conduit systématiquement au résultat: Det(U1, U2) = N = 43 , car il s'agit de l'aire algébrique du parallélogramme (U1, U2) associé à chacun des (N) points - (0, 0) compris - répartis dans le carré d'arête (N) et d'aire (N²).
Une calculette donne les résultats suivants:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
a U1x U1y U2x U2y Det U1^2 U2^2
3 1 3 -13 4 43 10 185
5 1 5 -8 3 43 26 73
12 4 5 -7 2 43 41 53
18 5 4 -2 7 43 41 53
19 2 -5 7 4 43 29 65
20 2 -3 9 8 43 13 145
26 5 1 -3 8 43 26 73
28 3 -2 8 9 43 13 145
29 3 1 -4 13 43 10 185
30 3 4 -7 5 43 25 74
33 4 3 -5 7 43 25 74
34 5 -2 4 7 43 29 65 |
Les meilleures suites (du point de vue de l'éloignement mutuel des points) sont celles qui correspondent aux normes maximales du plus court vecteur, soit ainsi a = 12 ou 18 (U12 = 41).
En utilisant un nombre premier plus élevé (par ex. 100003, 100019 ...) et en ne retenant que les valeurs contenues dans un domaine arbitraire [h, h+40], les ennuis d'alignement s'estompent sans doute, mais je n'ai pas eu le temps de tester cela.
Un ennui: l'inventaire des racines primitives, et plus encore celui des vecteurs de base devient très long (temps de calcul proportionnel à N²), et la machine doit ramer pendant une heure pour N ~ 10^5 .
Cordialement, W.