JavaScript Math.random Distribution normale (courbe en cloche gaussienne)?
Je veux savoir si la fonction JavaScript Math.le hasard est une distribution normale ou pas, si non, comment puis-je obtenir les numéros qui sont d'une distribution normale. Je n'ai pas trouvé de réponse claire dans l'Internet ou d'un algorithme comment créer aléatoire normalement distribuée numéros, que je comprends. Je veux de reconstruction d'un Schmidt-machine (allemand
physicien), la machine produit des nombres aléatoires de 0 ou 1, et ils doivent être normal distribué afin que je puisse les dessiner courbe en cloche de Gauss.
par exemple
la fonction de lecture aléatoire de produire 120 numéros (0 ou 1) et la moyenne à près de 60 fois 0 et 1.
source d'informationauteur Mangooxx
Vous devez vous connecter pour publier un commentaire.
Tout d'abord désolé de ne pas correctement la fixation de la réponse. J'ai oublié que cette page est indexée et la réponse DOIT être correcte ainsi que d'être utile à la personne qui a posé la question. J'espère que certains d'entre vous liront révisée de l'explication et de supprimer les scores négatifs ou fournir des commentaires comment cette réponse pourrait être encore amélioré.
Javascript Math.aléatoire est pas une Distribution Normale(courbe en cloche de Gauss). De ES 2015, 20.2.2.27 "Renvoie à un certain Nombre de valeur avec signe positif, supérieur ou égal à 0 mais inférieur à 1, choisi de manière aléatoire ou pseudo-aléatoire avec environ une distribution uniforme sur la plage, à l'aide d'un dépendant de l'implémentation de l'algorithme ou de la stratégie. Cette fonction ne prend pas d'arguments." Si la collection fournie lorsque n est assez élevé nous aurons environ une distribution uniforme. Toutes les valeurs dans l'intervalle ont la même probabilité d'apparition(ligne droite parallèle à l'axe des x, indiquant le nombre est compris entre 0.0 et 1.0).
Il y a plusieurs façons de faire la collecte de numéros avec une distribution normale. Comme répondu par Maxwell Collard la De Box-Muller transformer
n'transformer une distribution uniforme de distribution normale(le code peut être trouvé dans Maxwell Collard réponse).
Une réponse à une autre stackoverflow réponse à une question a une réponse avec d'autres distribution uniforme de distribution normale des algorithmes. Tels que:
Ziggourat,
Rapport des uniformes,
L'inversion de la CDF
D'ailleurs l'une des réponses, dit: dit:
Et enfin
Quand on n'a que deux valeurs (0 ou 1) de la courbe de Gauss est le même qu'une distribution uniforme avec 2 valeurs possibles. C'est pourquoi un simple
suffirait. Il serait de retour pseudo-aléatoirement, avec environ la même probabilité des valeurs 0 et 1.
Puisque c'est le premier résultat Google pour "js aléatoire gaussien" dans mon expérience, je ressens l'obligation de donner une réponse réelle à cette question.
La De Box-Muller transformer convertit deux indépendants uniforme variates sur (0, 1) en deux Gaussienne standard variates (moyenne 0, variance 1). Ce n'est probablement pas très performant en raison de la
sqrt
log
etcos
des appels, mais cette méthode est supérieure à l'théorème de la limite centrale approches (résumé N uniforme variates) parce qu'il n'est pas de restreindre la sortie de la délimitée de la plage (-N/2, N/2). Il est également très simple:Je voulais avoir approximativement gaussienne des nombres aléatoires entre 0 et 1, et après de nombreux tests j'ai trouvé ceci pour être le meilleur:
Et en bonus:
Le Javascript Math.random () - pseudo-fonction renvoie variates qui sont répartis également entre 0 et 1. Pour obtenir une distribution Gaussienne j'utilise ceci:
Je pense que je l'ai obtenu à partir de Knuth.
Distribution normale Entre 0 et 1
Bâtiment sur Maxwell Réponse, ce code utilise la De Box–Muller transformer pour vous donner une distribution normale entre 0 et 1 inclus. Il vient de ré-échantillonne les valeurs si c'est plus que de 3,6 écarts de distance (moins de 0,02% de chance).
Visualisations
n = 100
n = 10,000
n = 10 000 000 de
Distribution Normale Avec Min, Max, Inclinaison
Cette version vous permet de donner une min, max, et l'inclinaison du facteur. Voir mes exemples d'utilisation en bas.
Fonction qui utilise le théorème de la limite centrale.
Vous confondez la sortie de la fonction (qui est une distribution uniforme entre 0 et 1) le besoin de générer une distribution Gaussienne en appuyant à plusieurs reprises des nombres aléatoires de 0 ou 1 - d'après un grand nombre d'essais, leur somme sera d'environ distribuées normalement.
Vous pouvez utiliser le
Math.random()
fonction, puis arrondir le résultat à un nombre entier: si c'est < 0.5, return 0; si son >= 0.5, retour 1. Maintenant, vous avez l'égalité des probabilités de zéro et de un, et vous pouvez continuer avec l'approche que vous avez décrit dans votre question.Juste pour clarifier: je ne pense pas que c'est possible d'avoir un algorithme qui produit soit 0 ou 1 dans un normalement distribuées de façon normale de distribution nécessite une variable continue.
Lorsque vous faites le au-dessus pour dire 120 numéros, vous aurez en moyenne d'obtenir plus de 60 1 et 60 0. La distribution réelle que vous obtiendrez sera la distribution binomiale avec une moyenne de 60 et un écart-type de
La probabilité d'un nombre particulier
k
lorsque vous avezn
échantillons avec une probabilitép
(qui nous l'avons fixé à 0,5) estLorsque p = 0.5, vous vous retrouvez avec seulement les coefficients binomiaux - l'approche de la distribution normale pour n > 30, généralement.
À partir de la spécification:
Donc, c'est une uniforme distribution normale ou Gaussienne. C'est ce que vous allez trouver dans n'importe quel standard de nombre aléatoire installation dans toute langue de base d'exécution à l'extérieur du spécialisée de la statistique des bibliothèques.
Et une seule ligne exemple:
et un Violon
https://jsfiddle.net/rszgjqf8/
Pour ceux qui sont intéressés à générer des valeurs de la normale distrubution, je voudrais vous recommandons de vérifier cette mise en œuvre de la Ziggourat de l'algorithme en JavaScript: https://www.npmjs.com/package/node-ziggurat
Le code trouvé dans la page de l'auteur est:
Créer un Ziggurat.js fichier puis:
Pour moi, c'est le travail juste parfait et comme j'avais lu dans Wikipédia, c'est un algorithme plus efficace que le Box-Muller.
entrez description du lien ici
J'ai trouvé cette bibliothèque qui comprend de nombreuses fonctions Aléatoires. Vous pouvez soit l'installer via simjs de mnp, ou tout simplement prendre l'aléatoire-nœud-*.fichier js directement ce dont vous avez besoin.
http://www.simjs.com/random.html
http://www.simjs.com/download.html
C'est ma solution pour le problème, à l'aide de la Marsaglia polaire méthode. La portée dépend des paramètres que vous donnez, sans paramètres, il est presque génère jamais rien en dehors de la gamme.
Qu'il génère des deux normalement distribué numéros par itération, j'ai déclaré une variable sous la fenêtre.temp.spareNormal de saisir l'un de rechange si il y est. Peut-être pas le meilleur endroit pour ça, mais bon.
Vous auriez probablement pour arrondir le résultat à obtenir ce que vous voulez.
J'ai testé plusieurs fonctions avec le bouton droit de la configuration de tous fonctionnent de la même façon et bien.
http://jsfiddle.net/p3y40gf3/29/
De la limite centrale est belle, elle doit être avec (n=3 de 6) et 12 pour 12 à regarder que les autres. J'ai configuré les autres aussi (6) ou 12 ou 1/12 comme l'écart-type, je ne sais pas pourquoi 12.
De la limite centrale est un tout petit peu moins centré que la Boîte/Muller et de la Ziggourat.
Boîte/Muller et Ziggourat exactement le même aspect
cette variante par Joe(https://stackoverflow.com/a/33567961/466363) n'écart-type correctement:
Ziggourat est aussi agréable, mais qui doit être ajustée à partir de z score de 0 à 1 dirait qu'il fait de bons chiffres.
Boîte/Muller coupées est bonne, mais donne quelques chiffres répétés au coupées bords
mais il est très semblable à d'autres,
incorrect nombres aléatoires devraient être jeté pas coupés.
De la limite centrale variante, il est appelé Bates distribution qui est dans la moyenne
https://en.wikipedia.org/wiki/Bates_distribution
pas confondre avec Irwin Hall qui est une somme
https://en.wikipedia.org/wiki/Irwin%E2%80%93Hall_distribution
https://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution
Non verbeux fonction de l'échantillon une valeur aléatoire à partir d'une distribution Gaussienne j'ai écrit il y a quelques temps:
Cela devrait fonctionner si vous pince les valeurs de la plage que vous voulez.
Cette fonction renvoie une valeur entre 0 et 1. Les valeurs proches de 0,5 sont retournés le plus souvent.