La génération d'une variable aléatoire uniforme continue s'est avérée être une tâche difficile, peut-être parce que la formulation même du problème est légèrement absurde, parce que logiquement obtenir le hasard signifie ne pas trouver de solution. Cependant, en laissant le plus simple «comment ça se passera en anglais - je ne sais pas?», Dans les articles consacrés aux algorithmes, vous trouverez des ouvrages sur la création de séquences de nombres aléatoires uniquement.
La classe de générateur "True Random" utilise des phénomènes physiques et des contraintes externes, ainsi par exemple, pour générer un nombre aléatoire décimal, vous pouvez trouver la recommandation d'utiliser un "capteur atmosphérique". Naturellement, en tant qu'amateur de programmation, cet état de fait me paraissait injuste, et pendant assez longtemps «le problème mûrissait». Une variante de la solution, comme attendue de la formulation du problème, est apparue par hasard, en complément du problème de compression pour tasser des sphères dures . Le problème n'a pas trouvé de solution analytique, car il n'y a pas encore de preuve de son absence, respectivement, la source est tout à fait appropriée par des signes extérieurs. Cependant, je n'ai pas obtenu plus qu'une complexité infinie dans le calcul inverse de l'état du générateur.
L'idée n'est pas nouvelle, elle a été utilisée, par exemple, dans les systèmes UNIX, mais la raison pour laquelle je ne peux pas utiliser l'algorithme donné en tant que fonction n'est venue que d'une étude approfondie de son travail. Il est impossible de fournir mathématiquement une fluctuation finie d'un nombre infini de paramètres, donc, si le générateur est vraiment continu, alors, contrairement à l'arithmétique, le nombre de ses valeurs est infini. En pratique, je n'ai rencontré aucun échec dans son travail, mais au total ce ne sont que des mois de travail, bien que la «deuxième loi de la thermodynamique» soit aussi de mon côté, elle n'apporte pas de fiabilité logique stricte. Par conséquent, je ne prétends pas utiliser l'algorithme en tant que fonction pour des systèmes à haute fiabilité, mais j'admets que, avec des modifications supplémentaires, la fiabilité formelle peut être considérablement augmentée.
. , Diehard , "".
, . , , " " " ". :
D - D-2 .
. .
RandomSphere[Rn_: 2, Pn_: 1, Rb_: 1] :=
Module[{i, j, m, p, r, s, S, X, Xi, Xj, Pm},
X = Array[0 &, {Pn, Rn}]; Pm = Rn; s = 1/Sqrt[2];
For[p = 1, p <= Pn, p++, i = RandomInteger[{1, Rn}]; S = 0;
For[r = 1, r <= Rn, r++,
X[[p, r]] =
If[r != i, RandomReal[{-1, 1}], RandomChoice[{-1, 1}]];
S += X[[p, r]]^2];
X[[p]] *= Rb/Sqrt[S];
For[m = 1, m <= Pm, m++,
i = RandomInteger[{1, Rn}]; j = i;
While[i == j, j = RandomInteger[{1, Rn}]];
Xi = X[[p, i]];
Xj = X[[p, j]];
X[[p, i]] = s (Xj - Xi);
X[[p, j]] = s (Xj + Xi)]]; Return[X]]
, . , , , . , , .
, " " .
.
. , . , :
. : , . .
. , , N. O(N(N-N1)/2) O(N^2). , N^(1+1/D) , .
Diehard, Parking Test, "Numerous experiments prove" , , . , .
: , . , , , .
:
X, r, .. 2r :
(T(T-1))/2- , , Y :
, , . , , .
C# . , , Diehard .
- , "" . , , ParkingTest . . , . , , , .
, , . 10^8 , .
, , . , .
Au départ, je m'intéressais à la question de l'existence d'une source pour la réception pratiquement directe de nombres à virgule flottante aléatoires. Par conséquent, la nature de cet article est méthodique, l'algorithme ne prétend pas rivaliser en performances avec les RNG matériels, et encore plus avec les PRNG arithmétiques, car il contient, par exemple, le calcul de la racine, mais il peut toujours dupliquer ou déboguer un.
Implémentation d'algorithme en C #