de Cette question: aléatoire Générateur de numéro qui gravite les nombres à tout numéro donné de la gamme? J'ai fait des recherches depuis que j'ai déjà rencontré un tel générateur de nombres aléatoires. Tout ce que je me souviens était le nom "Mueller", alors je suppose que je l'ai trouvé ici:
Je peux trouver de nombreuses implémentations dans d'autres langues, mais je ne peux pas sembler la mettre en œuvre correctement en C #. p>
Cette page, par exemple, La méthode de la boîte-Muller pour générer des nombres aléatoires gaussiens dit que le code devrait ressembler à ceci (ceci est Pas C #): P>
public static double NextGaussianDouble(this Random r)
{
double u, v, S;
do
{
u = 2.0 * r.NextDouble() - 1.0;
v = 2.0 * r.NextDouble() - 1.0;
S = u * u + v * v;
}
while (S >= 1.0);
double fac = Math.Sqrt(-2.0 * Math.Log(S) / S);
return u * fac;
}
5 Réponses :
Je pense que la fonction renvoie des coordonnées polaires. Vous avez donc besoin des deux valeurs pour obtenir les résultats corrects. P>
En outre, la distribution gaussienne n'est pas comprise entre 0 .. 1 code>. Il peut facilement se retrouver comme 1000, mais la probabilité de cette occurrence est extrêmement faible. P>
Je ne suis pas de mathématicien, ni de statisticien, mais si j'estime à ce sujet, je ne m'attendrais pas à ce que la distribution gaussienne reprenne des chiffres dans une plage exacte. Compte tenu de votre implémentation, la moyenne est 0 et l'écart type est 1 afin que je puisse vous attendre à des valeurs réparties sur la courbe de la cloche avec 0 au centre puis que les chiffres s'écrient de 0 de chaque côté. Donc, la séquence couvrirait définitivement les chiffres +/-. p>
Puis, puisqu'il est statistique, pourquoi serait-il difficile limité à -1..1 simplement parce que le std.dev est 1? Il peut être statistiquement un peu de jeu de chaque côté et remplissez toujours l'exigence statistique. P>
La variation aléatoire uniforme est effectivement à 0..1, mais la variation aléatoire gaussienne (qui est ce que génère un algorithme de Box-Muller) peut être n'importe où sur la ligne réelle. Voir wiki / normaleDistribution pour plus de détails. P>
Votre code va bien. Votre erreur pense qu'il devrait renvoyer des valeurs exclusivement dans En outre, je pense que ce n'est pas la transformée Box-Mueller, mais est en fait la méthode Polar Marsaglia. P> [0, 1] code>. La distribution normale (standard) est une distribution avec un poids non nulle sur toute la ligne réelle. C'est-à-dire que les valeurs en dehors de [0, 1] code> sont possibles. En fait, les valeurs dans [- 1, 0] code> sont tout aussi probables que des valeurs dans [0, 1] code>, et d'ailleurs, le complément de [0, 1] code> a environ 66% du poids de la distribution normale. Par conséquent, 66% du temps que nous prévoyons une valeur en dehors de [0, 1] code>. P>
Bien dans la littérature, ils appellent simplement la forme Polar Box-Muller, voir .wikipedia.org / wiki / boîte% E2% 80% 93muller_transform # polar_for m
Ceci est une méthode de Monte Carlo afin que vous ne puissiez pas clamponner le résultat, mais ce que vous pouvez faire est d'ignorer des échantillons.
// return random value in the range [0,1].
double gaussian_random()
{
double sigma = 1.0/8.0; // or whatever works.
while ( 1 ) {
double z = gaussian() * sigma + 0.5;
if (z >= 0.0 && z <= 1.0)
return z;
}
}
Notez que j'ai vérifié quelques exemples du code ci-dessus, généralement en C ou Java, et ils ont tous l'air à peu près la même chose.
Êtes-vous sûr que le code C génère exactement ce que vous voulez?