jsxgraph 1.10.0 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/distrib/docs/files.html +2 -61
  3. package/distrib/docs/index.html +2 -58
  4. package/distrib/docs/static/jsxgraphcore.js +2 -2
  5. package/distrib/docs/symbols/Angle.html +2 -18
  6. package/distrib/docs/symbols/Arc.html +2 -18
  7. package/distrib/docs/symbols/Arrow.html +2 -18
  8. package/distrib/docs/symbols/Arrowparallel.html +2 -18
  9. package/distrib/docs/symbols/Axes3D.html +2 -18
  10. package/distrib/docs/symbols/Axis.html +2 -18
  11. package/distrib/docs/symbols/Axis3D.html +2 -18
  12. package/distrib/docs/symbols/Bisector.html +2 -18
  13. package/distrib/docs/symbols/Bisectorlines.html +2 -18
  14. package/distrib/docs/symbols/Boxplot.html +2 -18
  15. package/distrib/docs/symbols/Button.html +2 -18
  16. package/distrib/docs/symbols/Cardinalspline.html +2 -18
  17. package/distrib/docs/symbols/Chart.html +2 -18
  18. package/distrib/docs/symbols/Checkbox.html +2 -18
  19. package/distrib/docs/symbols/Circle.html +2 -18
  20. package/distrib/docs/symbols/Circle3D.html +2 -18
  21. package/distrib/docs/symbols/Circumcenter.html +2 -18
  22. package/distrib/docs/symbols/Circumcircle.html +2 -18
  23. package/distrib/docs/symbols/CircumcircleArc.html +2 -18
  24. package/distrib/docs/symbols/CircumcircleSector.html +2 -18
  25. package/distrib/docs/symbols/Comb.html +2 -18
  26. package/distrib/docs/symbols/Conic.html +2 -18
  27. package/distrib/docs/symbols/Curve.html +2 -18
  28. package/distrib/docs/symbols/Curve3D.html +2 -18
  29. package/distrib/docs/symbols/CurveDifference.html +2 -18
  30. package/distrib/docs/symbols/CurveIntersection.html +2 -18
  31. package/distrib/docs/symbols/CurveUnion.html +2 -18
  32. package/distrib/docs/symbols/Derivative.html +2 -18
  33. package/distrib/docs/symbols/Ellipse.html +2 -18
  34. package/distrib/docs/symbols/ForeignObject.html +2 -18
  35. package/distrib/docs/symbols/Functiongraph.html +2 -18
  36. package/distrib/docs/symbols/Functiongraph3D.html +2 -18
  37. package/distrib/docs/symbols/Glider.html +2 -18
  38. package/distrib/docs/symbols/Grid.html +2 -18
  39. package/distrib/docs/symbols/Group.html +2 -18
  40. package/distrib/docs/symbols/Hatch.html +2 -18
  41. package/distrib/docs/symbols/Hyperbola.html +2 -18
  42. package/distrib/docs/symbols/Image.html +2 -18
  43. package/distrib/docs/symbols/ImplicitCurve.html +2 -18
  44. package/distrib/docs/symbols/Incenter.html +2 -18
  45. package/distrib/docs/symbols/Incircle.html +2 -18
  46. package/distrib/docs/symbols/Inequality.html +2 -18
  47. package/distrib/docs/symbols/Input.html +2 -18
  48. package/distrib/docs/symbols/Integral.html +2 -18
  49. package/distrib/docs/symbols/Intersection.html +2 -18
  50. package/distrib/docs/symbols/IntersectionCircle3D.html +2 -18
  51. package/distrib/docs/symbols/IntersectionLine3D.html +2 -18
  52. package/distrib/docs/symbols/JXG.AbstractRenderer.html +2 -18
  53. package/distrib/docs/symbols/JXG.Board.html +4 -20
  54. package/distrib/docs/symbols/JXG.Board.infobox.html +2 -18
  55. package/distrib/docs/symbols/JXG.C.html +2 -18
  56. package/distrib/docs/symbols/JXG.CA.html +2 -18
  57. package/distrib/docs/symbols/JXG.CanvasRenderer.html +2 -18
  58. package/distrib/docs/symbols/JXG.Chart.html +2 -18
  59. package/distrib/docs/symbols/JXG.Circle.html +2 -18
  60. package/distrib/docs/symbols/JXG.Circle3D.html +2 -18
  61. package/distrib/docs/symbols/JXG.Complex.html +2 -18
  62. package/distrib/docs/symbols/JXG.Composition.html +2 -18
  63. package/distrib/docs/symbols/JXG.Coords.html +2 -18
  64. package/distrib/docs/symbols/JXG.CoordsElement.html +98 -22
  65. package/distrib/docs/symbols/JXG.Curve.html +2 -18
  66. package/distrib/docs/symbols/JXG.Curve3D.html +2 -18
  67. package/distrib/docs/symbols/JXG.Dump.html +2 -18
  68. package/distrib/docs/symbols/JXG.EventEmitter.html +2 -18
  69. package/distrib/docs/symbols/JXG.Expect.html +2 -18
  70. package/distrib/docs/symbols/JXG.ForeignObject.html +2 -18
  71. package/distrib/docs/symbols/JXG.GeometryElement.html +2 -18
  72. package/distrib/docs/symbols/JXG.GeometryElement3D.html +2 -18
  73. package/distrib/docs/symbols/JXG.GeonextParser.html +2 -18
  74. package/distrib/docs/symbols/JXG.Group.html +2 -18
  75. package/distrib/docs/symbols/JXG.Image.html +2 -18
  76. package/distrib/docs/symbols/JXG.JSXGraph.html +2 -18
  77. package/distrib/docs/symbols/JXG.JessieCode.html +2 -18
  78. package/distrib/docs/symbols/JXG.Legend.html +2 -18
  79. package/distrib/docs/symbols/JXG.Line.html +2 -18
  80. package/distrib/docs/symbols/JXG.Line3D.html +2 -18
  81. package/distrib/docs/symbols/JXG.Math.BoxQuadtree.html +2 -18
  82. package/distrib/docs/symbols/JXG.Math.Clip.html +2 -18
  83. package/distrib/docs/symbols/JXG.Math.Extrapolate.html +2 -18
  84. package/distrib/docs/symbols/JXG.Math.Geometry.html +2 -18
  85. package/distrib/docs/symbols/JXG.Math.ImplicitPlot.html +2 -18
  86. package/distrib/docs/symbols/JXG.Math.IntervalArithmetic.html +2 -18
  87. package/distrib/docs/symbols/JXG.Math.Metapost.html +2 -18
  88. package/distrib/docs/symbols/JXG.Math.Nlp.html +2 -18
  89. package/distrib/docs/symbols/JXG.Math.Numerics.html +2 -18
  90. package/distrib/docs/symbols/JXG.Math.Plot.html +2 -18
  91. package/distrib/docs/symbols/JXG.Math.Poly.Monomial.html +2 -18
  92. package/distrib/docs/symbols/JXG.Math.Poly.Polynomial.html +2 -18
  93. package/distrib/docs/symbols/JXG.Math.Poly.Ring.html +2 -18
  94. package/distrib/docs/symbols/JXG.Math.Poly.html +2 -18
  95. package/distrib/docs/symbols/JXG.Math.ProbFuncs.html +2 -18
  96. package/distrib/docs/symbols/JXG.Math.Quadtree.html +2 -18
  97. package/distrib/docs/symbols/JXG.Math.Statistics.html +22 -34
  98. package/distrib/docs/symbols/JXG.Math.html +2 -18
  99. package/distrib/docs/symbols/JXG.NoRenderer.html +2 -18
  100. package/distrib/docs/symbols/JXG.Options.html +2 -18
  101. package/distrib/docs/symbols/JXG.Plane3D.html +2 -18
  102. package/distrib/docs/symbols/JXG.Point.html +2 -18
  103. package/distrib/docs/symbols/JXG.Point3D.html +2 -18
  104. package/distrib/docs/symbols/JXG.Polygon.html +2 -18
  105. package/distrib/docs/symbols/JXG.Polygon3D.html +2 -18
  106. package/distrib/docs/symbols/JXG.PrefixParser.html +2 -18
  107. package/distrib/docs/symbols/JXG.SVGRenderer.html +2 -18
  108. package/distrib/docs/symbols/JXG.Sphere3D.html +2 -18
  109. package/distrib/docs/symbols/JXG.Surface3D.html +2 -18
  110. package/distrib/docs/symbols/JXG.Text.html +2 -18
  111. package/distrib/docs/symbols/JXG.Text3D.html +2 -18
  112. package/distrib/docs/symbols/JXG.Ticks.html +2 -18
  113. package/distrib/docs/symbols/JXG.Transformation.html +2 -18
  114. package/distrib/docs/symbols/JXG.Turtle.html +2 -18
  115. package/distrib/docs/symbols/JXG.Util.Base64.html +2 -18
  116. package/distrib/docs/symbols/JXG.Util.UTF8.html +2 -18
  117. package/distrib/docs/symbols/JXG.Util.Unzip.html +2 -18
  118. package/distrib/docs/symbols/JXG.Util.html +2 -18
  119. package/distrib/docs/symbols/JXG.VMLRenderer.html +2 -18
  120. package/distrib/docs/symbols/JXG.View3D.html +4 -19
  121. package/distrib/docs/symbols/JXG.XML.html +2 -18
  122. package/distrib/docs/symbols/JXG.html +2 -18
  123. package/distrib/docs/symbols/Label.html +2 -18
  124. package/distrib/docs/symbols/Legend.html +2 -18
  125. package/distrib/docs/symbols/Line.html +2 -18
  126. package/distrib/docs/symbols/Line3D.html +2 -18
  127. package/distrib/docs/symbols/MajorArc.html +2 -18
  128. package/distrib/docs/symbols/MajorSector.html +2 -18
  129. package/distrib/docs/symbols/Measurement.html +2 -18
  130. package/distrib/docs/symbols/Mesh3D.html +2 -18
  131. package/distrib/docs/symbols/Metapostspline.html +2 -18
  132. package/distrib/docs/symbols/Midpoint.html +2 -18
  133. package/distrib/docs/symbols/MinorArc.html +2 -18
  134. package/distrib/docs/symbols/MinorSector.html +2 -18
  135. package/distrib/docs/symbols/Mirrorpoint.html +2 -18
  136. package/distrib/docs/symbols/NonReflexAngle.html +2 -18
  137. package/distrib/docs/symbols/Normal.html +2 -18
  138. package/distrib/docs/symbols/Orthogonalprojection.html +2 -18
  139. package/distrib/docs/symbols/OtherIntersection.html +2 -18
  140. package/distrib/docs/symbols/Parabola.html +2 -18
  141. package/distrib/docs/symbols/Parallel.html +2 -18
  142. package/distrib/docs/symbols/Parallelogram.html +2 -18
  143. package/distrib/docs/symbols/Parallelpoint.html +2 -18
  144. package/distrib/docs/symbols/ParametricSurface3D.html +2 -18
  145. package/distrib/docs/symbols/Perpendicular.html +2 -18
  146. package/distrib/docs/symbols/PerpendicularPoint.html +2 -18
  147. package/distrib/docs/symbols/PerpendicularSegment.html +2 -18
  148. package/distrib/docs/symbols/Point.html +2 -18
  149. package/distrib/docs/symbols/Point3D.html +2 -18
  150. package/distrib/docs/symbols/PolarLine.html +2 -18
  151. package/distrib/docs/symbols/PolePoint.html +2 -18
  152. package/distrib/docs/symbols/Polygon.html +2 -18
  153. package/distrib/docs/symbols/PolygonalChain.html +2 -18
  154. package/distrib/docs/symbols/RadicalAxis.html +2 -18
  155. package/distrib/docs/symbols/Reflection.html +2 -18
  156. package/distrib/docs/symbols/ReflexAngle.html +2 -18
  157. package/distrib/docs/symbols/RegularPolygon.html +2 -18
  158. package/distrib/docs/symbols/Riemannsum.html +2 -18
  159. package/distrib/docs/symbols/Sector.html +2 -18
  160. package/distrib/docs/symbols/Segment.html +2 -18
  161. package/distrib/docs/symbols/Semicircle.html +2 -18
  162. package/distrib/docs/symbols/Slider.html +2 -18
  163. package/distrib/docs/symbols/Slopefield.html +2 -18
  164. package/distrib/docs/symbols/Slopetriangle.html +2 -18
  165. package/distrib/docs/symbols/Smartlabel.html +2 -18
  166. package/distrib/docs/symbols/Sphere3D.html +2 -18
  167. package/distrib/docs/symbols/Spline.html +2 -18
  168. package/distrib/docs/symbols/Stepfunction.html +2 -18
  169. package/distrib/docs/symbols/Tangent.html +2 -18
  170. package/distrib/docs/symbols/TangentTo.html +2 -18
  171. package/distrib/docs/symbols/Tapemeasure.html +2 -18
  172. package/distrib/docs/symbols/Text.html +12 -26
  173. package/distrib/docs/symbols/Text3D.html +2 -18
  174. package/distrib/docs/symbols/Ticks.html +2 -18
  175. package/distrib/docs/symbols/Ticks3D.html +2 -18
  176. package/distrib/docs/symbols/Tracecurve.html +2 -18
  177. package/distrib/docs/symbols/Transformation.html +2 -18
  178. package/distrib/docs/symbols/Turtle.html +2 -18
  179. package/distrib/docs/symbols/Vectorfield.html +2 -18
  180. package/distrib/docs/symbols/Vectorfield3D.html +53 -18
  181. package/distrib/docs/symbols/View3D.html +2 -18
  182. package/distrib/docs/symbols/_global_.html +2 -18
  183. package/distrib/docs/symbols/mirrorelement.html +2 -18
  184. package/distrib/docs/symbols/src/src_3d_box3d.js.html +261 -259
  185. package/distrib/docs/symbols/src/src_3d_curve3d.js.html +205 -156
  186. package/distrib/docs/symbols/src/src_3d_linspace3d.js.html +337 -327
  187. package/distrib/docs/symbols/src/src_3d_point3d.js.html +204 -187
  188. package/distrib/docs/symbols/src/src_3d_text3d.js.html +189 -177
  189. package/distrib/docs/symbols/src/src_3d_view3d.js.html +1246 -1236
  190. package/distrib/docs/symbols/src/src_base_board.js.html +2058 -2057
  191. package/distrib/docs/symbols/src/src_base_constants.js.html +1 -1
  192. package/distrib/docs/symbols/src/src_base_coordselement.js.html +383 -274
  193. package/distrib/docs/symbols/src/src_element_sector.js.html +1 -1
  194. package/distrib/docs/symbols/src/src_math_geometry.js.html +609 -604
  195. package/distrib/docs/symbols/src/src_math_statistics.js.html +418 -411
  196. package/distrib/docs/symbols/src/src_options.js.html +504 -502
  197. package/distrib/docs/symbols/src/src_options3d.js.html +952 -944
  198. package/distrib/docs.zip +0 -0
  199. package/distrib/geogebra.min.js +1 -1
  200. package/distrib/geonext.min.js +1 -1
  201. package/distrib/intergeo.min.js +1 -1
  202. package/distrib/jsxgraph.zip +0 -0
  203. package/distrib/jsxgraphcore.js +2 -2
  204. package/distrib/jsxgraphcore.mjs +2 -2
  205. package/distrib/jsxgraphcore.mjs.map +1 -1
  206. package/distrib/jsxgraphsrc.js +15405 -16038
  207. package/distrib/jsxgraphsrc.mjs +15405 -16038
  208. package/distrib/jsxgraphsrc.mjs.map +1 -1
  209. package/distrib/sketch.min.js +1 -1
  210. package/package.json +1 -1
  211. package/src/3d/box3d.js +2 -0
  212. package/src/3d/curve3d.js +53 -4
  213. package/src/3d/linspace3d.js +17 -7
  214. package/src/3d/point3d.js +20 -3
  215. package/src/3d/text3d.js +20 -8
  216. package/src/3d/view3d.js +17 -7
  217. package/src/base/board.js +1 -0
  218. package/src/base/constants.js +1 -1
  219. package/src/base/coordselement.js +119 -10
  220. package/src/element/sector.js +1 -1
  221. package/src/index.js +0 -3
  222. package/src/math/geometry.js +27 -22
  223. package/src/math/statistics.js +29 -22
  224. package/src/options.js +8 -6
  225. package/src/options3d.js +10 -2
  226. package/src/{server → unused/server}/JXGServer.py +4 -9
  227. package/src/{server → unused/server}/JXGServerModule.py +2 -2
  228. package/src/{server → unused/server}/README.md +25 -14
  229. package/src/{server → unused/server}/RStats.py +1 -1
  230. package/src/{server → unused/server}/YahooFinance.py +4 -4
  231. package/src/{server → unused/server}/fft.py +6 -6
  232. package/src/{server → unused/server}/geoloci.py +17 -17
  233. package/src/{server → unused/server}/jxggroebner.py +22 -22
  234. package/src/index2.js +0 -105
  235. /package/src/{element → unused}/locus.js +0 -0
  236. /package/src/{server → unused/server}/JXG.py +0 -0
  237. /package/src/{server → unused/server}/jxgtestplugin.py +0 -0
  238. /package/src/{server → unused/server}/server.js +0 -0
  239. /package/src/{math → unused}/symbolic.js +0 -0
@@ -995,421 +995,428 @@
995
995
  <span class='line'>988</span> * @memberof JXG.Math.Statistics
996
996
  <span class='line'>989</span> *
997
997
  <span class='line'>990</span> * @example
998
- <span class='line'>991</span> * let board = JXG.JSXGraph.initBoard('JXGbox',
999
- <span class='line'>992</span> * { boundingbox: [-1.7, .5, 30, -.03], axis: true});
998
+ <span class='line'>991</span> * let board = JXG.JSXGraph.initBoard('jxgbox',
999
+ <span class='line'>992</span> * { boundingbox: [-1.7, .5, 30, -.03], axis: true });
1000
1000
  <span class='line'>993</span> *
1001
- <span class='line'>994</span> * let runs = [
1002
- <span class='line'>995</span> * [0.5, 20, 'blue'],
1003
- <span class='line'>996</span> * [0.7, 20, 'green'],
1004
- <span class='line'>997</span> * [0.5, 40, 'red'],
1005
- <span class='line'>998</span> * ]
1001
+ <span class='line'>994</span> * let runs = [
1002
+ <span class='line'>995</span> * [0.5, 20, 'blue'],
1003
+ <span class='line'>996</span> * [0.7, 20, 'green'],
1004
+ <span class='line'>997</span> * [0.5, 40, 'red'],
1005
+ <span class='line'>998</span> * ];
1006
1006
  <span class='line'>999</span> *
1007
- <span class='line'>1000</span> * let labelY = .4
1008
- <span class='line'>1001</span> * runs.forEach((run,i) => {
1009
- <span class='line'>1002</span> * board.create('segment',[[7,labelY-(i/50)],[9,labelY-(i/50)]],{strokeColor:run[2]})
1010
- <span class='line'>1003</span> * board.create('text',[10,labelY-(i/50),`p=${run[0]}, n=${run[1]}`])
1007
+ <span class='line'>1000</span> * let labelY = .4;
1008
+ <span class='line'>1001</span> * runs.forEach((run, i) => {
1009
+ <span class='line'>1002</span> * board.create('segment', [[7, labelY - (i / 50)], [9, labelY - (i / 50)]], { strokeColor: run[2] });
1010
+ <span class='line'>1003</span> * board.create('text', [10, labelY - (i / 50), `p=${run[0]}, n=${run[1]}`]);
1011
1011
  <span class='line'>1004</span> *
1012
- <span class='line'>1005</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomBinomial(run[1],run[0]))
1013
- <span class='line'>1006</span> * let res = JXG.Math.Statistics.histogram(x, { bins: 40, density: true, cumulative: false, range: [0, 40] });
1014
- <span class='line'>1007</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2]});
1015
- <span class='line'>1008</span> * })
1016
- <span class='line'>1009</span> * }
1017
- <span class='line'>1010</span> *
1018
- <span class='line'>1011</span> *
1019
- <span class='line'>1012</span> * &lt;/pre>&lt;div id="JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-3" class="jxgbox" style="width: 300px; height: 300px;">&lt;/div>
1020
- <span class='line'>1013</span> * &lt;script type="text/javascript">
1021
- <span class='line'>1014</span> * {
1022
- <span class='line'>1015</span> * let board = JXG.JSXGraph.initBoard('JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-3',
1023
- <span class='line'>1016</span> * { boundingbox: [-1.7, .5, 30, -.03], axis: true});
1024
- <span class='line'>1017</span> *
1025
- <span class='line'>1018</span> * let runs = [
1026
- <span class='line'>1019</span> * [0.5, 20, 'blue'],
1027
- <span class='line'>1020</span> * [0.7, 20, 'green'],
1028
- <span class='line'>1021</span> * [0.5, 40, 'red'],
1029
- <span class='line'>1022</span> * ]
1030
- <span class='line'>1023</span> *
1031
- <span class='line'>1024</span> * let labelY = .4
1032
- <span class='line'>1025</span> * runs.forEach((run,i) => {
1033
- <span class='line'>1026</span> * board.create('segment',[[7,labelY-(i/50)],[9,labelY-(i/50)]],{strokeColor:run[2]})
1034
- <span class='line'>1027</span> * board.create('text',[10,labelY-(i/50),`p=${run[0]}, n=${run[1]}`])
1035
- <span class='line'>1028</span> *
1036
- <span class='line'>1029</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomBinomial(run[1],run[0]))
1037
- <span class='line'>1030</span> * let res = JXG.Math.Statistics.histogram(x, { bins: 40, density: true, cumulative: false, range: [0, 40] });
1038
- <span class='line'>1031</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2]});
1039
- <span class='line'>1032</span> * })
1040
- <span class='line'>1033</span> * }
1041
- <span class='line'>1034</span> * &lt;/script>&lt;pre>
1042
- <span class='line'>1035</span> *
1043
- <span class='line'>1036</span> */</span><span class="WHIT">
1044
- <span class='line'>1037</span> </span><span class="WHIT"> </span><span class="NAME">randomBinomial</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1045
- <span class='line'>1038</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
1046
- <span class='line'>1039</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">N1</span><span class="PUNC">;</span><span class="WHIT">
1047
- <span class='line'>1040</span>
1048
- <span class='line'>1041</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1049
- <span class='line'>1042</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1050
- <span class='line'>1043</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1012
+ <span class='line'>1005</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomBinomial(run[1], run[0]));
1013
+ <span class='line'>1006</span> * let res = JXG.Math.Statistics.histogram(x, {
1014
+ <span class='line'>1007</span> * bins: 40,
1015
+ <span class='line'>1008</span> * density: true,
1016
+ <span class='line'>1009</span> * cumulative: false,
1017
+ <span class='line'>1010</span> * range: [0, 40]
1018
+ <span class='line'>1011</span> * });
1019
+ <span class='line'>1012</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2] });
1020
+ <span class='line'>1013</span> * });
1021
+ <span class='line'>1014</span> *
1022
+ <span class='line'>1015</span> *
1023
+ <span class='line'>1016</span> * &lt;/pre>&lt;div id="JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-3" class="jxgbox" style="width: 300px; height: 300px;">&lt;/div>
1024
+ <span class='line'>1017</span> * &lt;script type="text/javascript">
1025
+ <span class='line'>1018</span> * {
1026
+ <span class='line'>1019</span> * let board = JXG.JSXGraph.initBoard('JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-3',
1027
+ <span class='line'>1020</span> * { boundingbox: [-1.7, .5, 30, -.03], axis: true});
1028
+ <span class='line'>1021</span> *
1029
+ <span class='line'>1022</span> * let runs = [
1030
+ <span class='line'>1023</span> * [0.5, 20, 'blue'],
1031
+ <span class='line'>1024</span> * [0.7, 20, 'green'],
1032
+ <span class='line'>1025</span> * [0.5, 40, 'red'],
1033
+ <span class='line'>1026</span> * ]
1034
+ <span class='line'>1027</span> *
1035
+ <span class='line'>1028</span> * let labelY = .4
1036
+ <span class='line'>1029</span> * runs.forEach((run,i) => {
1037
+ <span class='line'>1030</span> * board.create('segment',[[7,labelY-(i/50)],[9,labelY-(i/50)]],{strokeColor:run[2]})
1038
+ <span class='line'>1031</span> * board.create('text',[10,labelY-(i/50),`p=${run[0]}, n=${run[1]}`])
1039
+ <span class='line'>1032</span> *
1040
+ <span class='line'>1033</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomBinomial(run[1],run[0]))
1041
+ <span class='line'>1034</span> * let res = JXG.Math.Statistics.histogram(x, { bins: 40, density: true, cumulative: false, range: [0, 40] });
1042
+ <span class='line'>1035</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2]});
1043
+ <span class='line'>1036</span> * })
1044
+ <span class='line'>1037</span> * }
1045
+ <span class='line'>1038</span> * &lt;/script>&lt;pre>
1046
+ <span class='line'>1039</span> *
1047
+ <span class='line'>1040</span> */</span><span class="WHIT">
1048
+ <span class='line'>1041</span> </span><span class="WHIT"> </span><span class="NAME">randomBinomial</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1049
+ <span class='line'>1042</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
1050
+ <span class='line'>1043</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">N1</span><span class="PUNC">;</span><span class="WHIT">
1051
1051
  <span class='line'>1044</span>
1052
- <span class='line'>1045</span> </span><span class="WHIT"> </span><span class="COMM">// Edge cases</span><span class="WHIT">
1053
- <span class='line'>1046</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1054
- <span class='line'>1047</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1055
- <span class='line'>1048</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1056
- <span class='line'>1049</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1057
- <span class='line'>1050</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">;</span><span class="WHIT">
1058
- <span class='line'>1051</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1059
- <span class='line'>1052</span>
1060
- <span class='line'>1053</span> </span><span class="WHIT"> </span><span class="COMM">// Now, we can assume 0 &lt; p &lt; 1.</span><span class="WHIT">
1061
- <span class='line'>1054</span>
1062
- <span class='line'>1055</span> </span><span class="WHIT"> </span><span class="COMM">// Fast path for common cases</span><span class="WHIT">
1063
- <span class='line'>1056</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1064
- <span class='line'>1057</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1065
- <span class='line'>1058</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1066
- <span class='line'>1059</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1067
- <span class='line'>1060</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1068
- <span class='line'>1061</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1069
- <span class='line'>1062</span>
1070
- <span class='line'>1063</span> </span><span class="WHIT"> </span><span class="COMM">// Exploit symmetry</span><span class="WHIT">
1071
- <span class='line'>1064</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0.5</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1072
- <span class='line'>1065</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1073
- <span class='line'>1066</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1074
- <span class='line'>1067</span>
1075
- <span class='line'>1068</span> </span><span class="WHIT"> </span><span class="COMM">// General case: n > 1, p &lt;= 0.5</span><span class="WHIT">
1076
- <span class='line'>1069</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1077
- <span class='line'>1070</span> </span><span class="WHIT"> </span><span class="COMM">// n small:</span><span class="WHIT">
1078
- <span class='line'>1071</span> </span><span class="WHIT"> </span><span class="COMM">// Algorithm BG (Devroye) from:</span><span class="WHIT">
1079
- <span class='line'>1072</span> </span><span class="WHIT"> </span><span class="COMM">// https://dl.acm.org/doi/pdf/10.1145/42372.42381</span><span class="WHIT">
1080
- <span class='line'>1073</span> </span><span class="WHIT"> </span><span class="COMM">// Time O(np) so suitable for np small only.</span><span class="WHIT">
1081
- <span class='line'>1074</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1082
- <span class='line'>1075</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1083
- <span class='line'>1076</span>
1084
- <span class='line'>1077</span> </span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1085
- <span class='line'>1078</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1086
- <span class='line'>1079</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1087
- <span class='line'>1080</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1088
- <span class='line'>1081</span>
1089
- <span class='line'>1082</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1090
- <span class='line'>1083</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1091
- <span class='line'>1084</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1092
- <span class='line'>1085</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1093
- <span class='line'>1086</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1094
- <span class='line'>1087</span> </span><span class="WHIT"> </span><span class="COMM">// n large:</span><span class="WHIT">
1095
- <span class='line'>1088</span> </span><span class="WHIT"> </span><span class="COMM">// Knuth, TAOCP 2, p 131</span><span class="WHIT">
1096
- <span class='line'>1089</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">0.5</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1097
- <span class='line'>1090</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1098
- <span class='line'>1091</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBeta</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1099
- <span class='line'>1092</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1100
- <span class='line'>1093</span> </span><span class="WHIT"> </span><span class="NAME">N1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1101
- <span class='line'>1094</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">N1</span><span class="PUNC">;</span><span class="WHIT">
1102
- <span class='line'>1095</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1103
- <span class='line'>1096</span> </span><span class="WHIT"> </span><span class="NAME">N1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1104
- <span class='line'>1097</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">N1</span><span class="PUNC">;</span><span class="WHIT">
1105
- <span class='line'>1098</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1106
- <span class='line'>1099</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1107
- <span class='line'>1100</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
1108
- <span class='line'>1101</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1109
- <span class='line'>1102</span>
1110
- <span class='line'>1103</span> </span><span class="WHIT"> </span><span class="COMM">/**
1111
- <span class='line'>1104</span> * Generate values for a random variable in geometric distribution with probability &lt;i>p&lt;/i>.
1112
- <span class='line'>1105</span> * See &lt;a href="https://en.wikipedia.org/wiki/Geometric_distribution">https://en.wikipedia.org/wiki/Geometric_distribution&lt;/a>.
1113
- <span class='line'>1106</span> *
1114
- <span class='line'>1107</span> * @param {Number} p (0 &lt;= p &lt;= 1)
1115
- <span class='line'>1108</span> * @returns Number
1116
- <span class='line'>1109</span> * @memberof JXG.Math.Statistics
1117
- <span class='line'>1110</span> */</span><span class="WHIT">
1118
- <span class='line'>1111</span> </span><span class="WHIT"> </span><span class="NAME">randomGeometric</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1119
- <span class='line'>1112</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">;</span><span class="WHIT">
1120
- <span class='line'>1113</span>
1121
- <span class='line'>1114</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1122
- <span class='line'>1115</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1123
- <span class='line'>1116</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1124
- <span class='line'>1117</span> </span><span class="WHIT"> </span><span class="COMM">// Knuth, TAOCP 2, p 131</span><span class="WHIT">
1125
- <span class='line'>1118</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1126
- <span class='line'>1119</span>
1127
- <span class='line'>1120</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.ceil</span><span class="PUNC">(</span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NAME">u</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1128
- <span class='line'>1121</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1129
- <span class='line'>1122</span>
1130
- <span class='line'>1123</span> </span><span class="WHIT"> </span><span class="COMM">/**
1131
- <span class='line'>1124</span> * Generate values for a random variable in Poisson distribution with mean &lt;i>mu&lt;/i>.
1132
- <span class='line'>1125</span> * See &lt;a href="https://en.wikipedia.org/wiki/Poisson_distribution">https://en.wikipedia.org/wiki/Poisson_distribution&lt;/a>.
1133
- <span class='line'>1126</span> *
1134
- <span class='line'>1127</span> * @param {Number} mu (0 &lt; mu)
1135
- <span class='line'>1128</span> * @returns Number
1136
- <span class='line'>1129</span> * @memberof JXG.Math.Statistics
1137
- <span class='line'>1130</span> */</span><span class="WHIT">
1138
- <span class='line'>1131</span> </span><span class="WHIT"> </span><span class="NAME">randomPoisson</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">mu</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1139
- <span class='line'>1132</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.exp</span><span class="PUNC">(</span><span class="PUNC">-</span><span class="NAME">mu</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
1140
- <span class='line'>1133</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="PUNC">,</span><span class="WHIT">
1141
- <span class='line'>1134</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
1142
- <span class='line'>1135</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
1143
- <span class='line'>1136</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT">
1144
- <span class='line'>1137</span> </span><span class="WHIT"> </span><span class="NAME">alpha</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">7</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">8</span><span class="PUNC">;</span><span class="WHIT">
1145
- <span class='line'>1138</span>
1146
- <span class='line'>1139</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1147
- <span class='line'>1140</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1148
- <span class='line'>1141</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1052
+ <span class='line'>1045</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1053
+ <span class='line'>1046</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1054
+ <span class='line'>1047</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1055
+ <span class='line'>1048</span>
1056
+ <span class='line'>1049</span> </span><span class="WHIT"> </span><span class="COMM">// Edge cases</span><span class="WHIT">
1057
+ <span class='line'>1050</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1058
+ <span class='line'>1051</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1059
+ <span class='line'>1052</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1060
+ <span class='line'>1053</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1061
+ <span class='line'>1054</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">;</span><span class="WHIT">
1062
+ <span class='line'>1055</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1063
+ <span class='line'>1056</span>
1064
+ <span class='line'>1057</span> </span><span class="WHIT"> </span><span class="COMM">// Now, we can assume 0 &lt; p &lt; 1.</span><span class="WHIT">
1065
+ <span class='line'>1058</span>
1066
+ <span class='line'>1059</span> </span><span class="WHIT"> </span><span class="COMM">// Fast path for common cases</span><span class="WHIT">
1067
+ <span class='line'>1060</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1068
+ <span class='line'>1061</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1069
+ <span class='line'>1062</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1070
+ <span class='line'>1063</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1071
+ <span class='line'>1064</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1072
+ <span class='line'>1065</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1073
+ <span class='line'>1066</span>
1074
+ <span class='line'>1067</span> </span><span class="WHIT"> </span><span class="COMM">// Exploit symmetry</span><span class="WHIT">
1075
+ <span class='line'>1068</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0.5</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1076
+ <span class='line'>1069</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1077
+ <span class='line'>1070</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1078
+ <span class='line'>1071</span>
1079
+ <span class='line'>1072</span> </span><span class="WHIT"> </span><span class="COMM">// General case: n > 1, p &lt;= 0.5</span><span class="WHIT">
1080
+ <span class='line'>1073</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1081
+ <span class='line'>1074</span> </span><span class="WHIT"> </span><span class="COMM">// n small:</span><span class="WHIT">
1082
+ <span class='line'>1075</span> </span><span class="WHIT"> </span><span class="COMM">// Algorithm BG (Devroye) from:</span><span class="WHIT">
1083
+ <span class='line'>1076</span> </span><span class="WHIT"> </span><span class="COMM">// https://dl.acm.org/doi/pdf/10.1145/42372.42381</span><span class="WHIT">
1084
+ <span class='line'>1077</span> </span><span class="WHIT"> </span><span class="COMM">// Time O(np) so suitable for np small only.</span><span class="WHIT">
1085
+ <span class='line'>1078</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1086
+ <span class='line'>1079</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1087
+ <span class='line'>1080</span>
1088
+ <span class='line'>1081</span> </span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1089
+ <span class='line'>1082</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1090
+ <span class='line'>1083</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1091
+ <span class='line'>1084</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1092
+ <span class='line'>1085</span>
1093
+ <span class='line'>1086</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1094
+ <span class='line'>1087</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1095
+ <span class='line'>1088</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1096
+ <span class='line'>1089</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1097
+ <span class='line'>1090</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1098
+ <span class='line'>1091</span> </span><span class="WHIT"> </span><span class="COMM">// n large:</span><span class="WHIT">
1099
+ <span class='line'>1092</span> </span><span class="WHIT"> </span><span class="COMM">// Knuth, TAOCP 2, p 131</span><span class="WHIT">
1100
+ <span class='line'>1093</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">0.5</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1101
+ <span class='line'>1094</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1102
+ <span class='line'>1095</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBeta</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1103
+ <span class='line'>1096</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1104
+ <span class='line'>1097</span> </span><span class="WHIT"> </span><span class="NAME">N1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1105
+ <span class='line'>1098</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">N1</span><span class="PUNC">;</span><span class="WHIT">
1106
+ <span class='line'>1099</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1107
+ <span class='line'>1100</span> </span><span class="WHIT"> </span><span class="NAME">N1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1108
+ <span class='line'>1101</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">N1</span><span class="PUNC">;</span><span class="WHIT">
1109
+ <span class='line'>1102</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1110
+ <span class='line'>1103</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1111
+ <span class='line'>1104</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
1112
+ <span class='line'>1105</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1113
+ <span class='line'>1106</span>
1114
+ <span class='line'>1107</span> </span><span class="WHIT"> </span><span class="COMM">/**
1115
+ <span class='line'>1108</span> * Generate values for a random variable in geometric distribution with probability &lt;i>p&lt;/i>.
1116
+ <span class='line'>1109</span> * See &lt;a href="https://en.wikipedia.org/wiki/Geometric_distribution">https://en.wikipedia.org/wiki/Geometric_distribution&lt;/a>.
1117
+ <span class='line'>1110</span> *
1118
+ <span class='line'>1111</span> * @param {Number} p (0 &lt;= p &lt;= 1)
1119
+ <span class='line'>1112</span> * @returns Number
1120
+ <span class='line'>1113</span> * @memberof JXG.Math.Statistics
1121
+ <span class='line'>1114</span> */</span><span class="WHIT">
1122
+ <span class='line'>1115</span> </span><span class="WHIT"> </span><span class="NAME">randomGeometric</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1123
+ <span class='line'>1116</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">;</span><span class="WHIT">
1124
+ <span class='line'>1117</span>
1125
+ <span class='line'>1118</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1126
+ <span class='line'>1119</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1127
+ <span class='line'>1120</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1128
+ <span class='line'>1121</span> </span><span class="WHIT"> </span><span class="COMM">// Knuth, TAOCP 2, p 131</span><span class="WHIT">
1129
+ <span class='line'>1122</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1130
+ <span class='line'>1123</span>
1131
+ <span class='line'>1124</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.ceil</span><span class="PUNC">(</span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NAME">u</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">Math.log</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1132
+ <span class='line'>1125</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1133
+ <span class='line'>1126</span>
1134
+ <span class='line'>1127</span> </span><span class="WHIT"> </span><span class="COMM">/**
1135
+ <span class='line'>1128</span> * Generate values for a random variable in Poisson distribution with mean &lt;i>mu&lt;/i>.
1136
+ <span class='line'>1129</span> * See &lt;a href="https://en.wikipedia.org/wiki/Poisson_distribution">https://en.wikipedia.org/wiki/Poisson_distribution&lt;/a>.
1137
+ <span class='line'>1130</span> *
1138
+ <span class='line'>1131</span> * @param {Number} mu (0 &lt; mu)
1139
+ <span class='line'>1132</span> * @returns Number
1140
+ <span class='line'>1133</span> * @memberof JXG.Math.Statistics
1141
+ <span class='line'>1134</span> */</span><span class="WHIT">
1142
+ <span class='line'>1135</span> </span><span class="WHIT"> </span><span class="NAME">randomPoisson</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">mu</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1143
+ <span class='line'>1136</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.exp</span><span class="PUNC">(</span><span class="PUNC">-</span><span class="NAME">mu</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
1144
+ <span class='line'>1137</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="PUNC">,</span><span class="WHIT">
1145
+ <span class='line'>1138</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
1146
+ <span class='line'>1139</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
1147
+ <span class='line'>1140</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT">
1148
+ <span class='line'>1141</span> </span><span class="WHIT"> </span><span class="NAME">alpha</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">7</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">8</span><span class="PUNC">;</span><span class="WHIT">
1149
1149
  <span class='line'>1142</span>
1150
- <span class='line'>1143</span> </span><span class="WHIT"> </span><span class="COMM">// Knuth, TAOCP 2, p 132</span><span class="WHIT">
1151
- <span class='line'>1144</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1152
- <span class='line'>1145</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1153
- <span class='line'>1146</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1154
- <span class='line'>1147</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1155
- <span class='line'>1148</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1156
- <span class='line'>1149</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1157
- <span class='line'>1150</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1158
- <span class='line'>1151</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">alpha</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">mu</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1159
- <span class='line'>1152</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomGamma</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1160
- <span class='line'>1153</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">mu</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1161
- <span class='line'>1154</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.randomPoisson</span><span class="PUNC">(</span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1162
- <span class='line'>1155</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1163
- <span class='line'>1156</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1164
- <span class='line'>1157</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1165
- <span class='line'>1158</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1166
- <span class='line'>1159</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">N</span><span class="PUNC">;</span><span class="WHIT">
1167
- <span class='line'>1160</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1168
- <span class='line'>1161</span>
1169
- <span class='line'>1162</span> </span><span class="WHIT"> </span><span class="COMM">/**
1170
- <span class='line'>1163</span> * Generate values for a random variable in Pareto distribution with
1171
- <span class='line'>1164</span> * shape &lt;i>gamma&lt;/i> and scale &lt;i>k&lt;/i>.
1172
- <span class='line'>1165</span> * See &lt;a href="https://en.wikipedia.org/wiki/Pareto_distribution">https://en.wikipedia.org/wiki/Pareto_distribution&lt;/a>.
1173
- <span class='line'>1166</span> * Method: use inverse transformation sampling.
1174
- <span class='line'>1167</span> *
1175
- <span class='line'>1168</span> * @param {Number} gamma shape (0 &lt; gamma)
1176
- <span class='line'>1169</span> * @param {Number} k scale (0 &lt; k &lt; x)
1177
- <span class='line'>1170</span> * @returns Number
1178
- <span class='line'>1171</span> * @memberof JXG.Math.Statistics
1179
- <span class='line'>1172</span> */</span><span class="WHIT">
1180
- <span class='line'>1173</span> </span><span class="WHIT"> </span><span class="NAME">randomPareto</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">gamma</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1181
- <span class='line'>1174</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1182
- <span class='line'>1175</span>
1183
- <span class='line'>1176</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">gamma</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1184
- <span class='line'>1177</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1185
- <span class='line'>1178</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1186
- <span class='line'>1179</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">Math.pow</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">gamma</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1187
- <span class='line'>1180</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1188
- <span class='line'>1181</span>
1189
- <span class='line'>1182</span> </span><span class="WHIT"> </span><span class="COMM">/**
1190
- <span class='line'>1183</span> * Generate values for a random variable in hypergeometric distribution.
1191
- <span class='line'>1184</span> * Samples are drawn from a hypergeometric distribution with specified parameters, &lt;i>good&lt;/i> (ways to make a good selection),
1192
- <span class='line'>1185</span> * &lt;i>bad&lt;/i> (ways to make a bad selection), and &lt;i>samples&lt;/i> (number of items sampled, which is less than or equal to &lt;i>good + bad&lt;/i>).
1193
- <span class='line'>1186</span> * &lt;p>
1194
- <span class='line'>1187</span> * Naive implementation with runtime &lt;i>O(samples)&lt;/i>.
1195
- <span class='line'>1188</span> *
1196
- <span class='line'>1189</span> * @param {Number} good ways to make a good selection
1197
- <span class='line'>1190</span> * @param {Number} bad ways to make a bad selection
1198
- <span class='line'>1191</span> * @param {Number} samples number of items sampled
1199
- <span class='line'>1192</span> * @returns
1200
- <span class='line'>1193</span> * @memberof JXG.Math.Statistics
1201
- <span class='line'>1194</span> */</span><span class="WHIT">
1202
- <span class='line'>1195</span> </span><span class="WHIT"> </span><span class="NAME">randomHypergeometric</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">good</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1203
- <span class='line'>1196</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">,</span><span class="WHIT">
1204
- <span class='line'>1197</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
1205
- <span class='line'>1198</span> </span><span class="WHIT"> </span><span class="COMM">// kk,</span><span class="WHIT">
1206
- <span class='line'>1199</span> </span><span class="WHIT"> </span><span class="COMM">// n = good + bad,</span><span class="WHIT">
1207
- <span class='line'>1200</span> </span><span class="WHIT"> </span><span class="NAME">d1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">,</span><span class="WHIT">
1208
- <span class='line'>1201</span> </span><span class="WHIT"> </span><span class="NAME">d2</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.min</span><span class="PUNC">(</span><span class="NAME">good</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
1209
- <span class='line'>1202</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">d2</span><span class="PUNC">;</span><span class="WHIT">
1210
- <span class='line'>1203</span>
1211
- <span class='line'>1204</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1212
- <span class='line'>1205</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1213
- <span class='line'>1206</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1150
+ <span class='line'>1143</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1151
+ <span class='line'>1144</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1152
+ <span class='line'>1145</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1153
+ <span class='line'>1146</span>
1154
+ <span class='line'>1147</span> </span><span class="WHIT"> </span><span class="COMM">// Knuth, TAOCP 2, p 132</span><span class="WHIT">
1155
+ <span class='line'>1148</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1156
+ <span class='line'>1149</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1157
+ <span class='line'>1150</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1158
+ <span class='line'>1151</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1159
+ <span class='line'>1152</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1160
+ <span class='line'>1153</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1161
+ <span class='line'>1154</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1162
+ <span class='line'>1155</span> </span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">alpha</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">mu</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1163
+ <span class='line'>1156</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomGamma</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1164
+ <span class='line'>1157</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">mu</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1165
+ <span class='line'>1158</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.randomPoisson</span><span class="PUNC">(</span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1166
+ <span class='line'>1159</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1167
+ <span class='line'>1160</span> </span><span class="WHIT"> </span><span class="NAME">N</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.randomBinomial</span><span class="PUNC">(</span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">mu</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1168
+ <span class='line'>1161</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1169
+ <span class='line'>1162</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1170
+ <span class='line'>1163</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">N</span><span class="PUNC">;</span><span class="WHIT">
1171
+ <span class='line'>1164</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1172
+ <span class='line'>1165</span>
1173
+ <span class='line'>1166</span> </span><span class="WHIT"> </span><span class="COMM">/**
1174
+ <span class='line'>1167</span> * Generate values for a random variable in Pareto distribution with
1175
+ <span class='line'>1168</span> * shape &lt;i>gamma&lt;/i> and scale &lt;i>k&lt;/i>.
1176
+ <span class='line'>1169</span> * See &lt;a href="https://en.wikipedia.org/wiki/Pareto_distribution">https://en.wikipedia.org/wiki/Pareto_distribution&lt;/a>.
1177
+ <span class='line'>1170</span> * Method: use inverse transformation sampling.
1178
+ <span class='line'>1171</span> *
1179
+ <span class='line'>1172</span> * @param {Number} gamma shape (0 &lt; gamma)
1180
+ <span class='line'>1173</span> * @param {Number} k scale (0 &lt; k &lt; x)
1181
+ <span class='line'>1174</span> * @returns Number
1182
+ <span class='line'>1175</span> * @memberof JXG.Math.Statistics
1183
+ <span class='line'>1176</span> */</span><span class="WHIT">
1184
+ <span class='line'>1177</span> </span><span class="WHIT"> </span><span class="NAME">randomPareto</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">gamma</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1185
+ <span class='line'>1178</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1186
+ <span class='line'>1179</span>
1187
+ <span class='line'>1180</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">gamma</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1188
+ <span class='line'>1181</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1189
+ <span class='line'>1182</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1190
+ <span class='line'>1183</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">Math.pow</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">gamma</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1191
+ <span class='line'>1184</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1192
+ <span class='line'>1185</span>
1193
+ <span class='line'>1186</span> </span><span class="WHIT"> </span><span class="COMM">/**
1194
+ <span class='line'>1187</span> * Generate values for a random variable in hypergeometric distribution.
1195
+ <span class='line'>1188</span> * Samples are drawn from a hypergeometric distribution with specified parameters, &lt;i>good&lt;/i> (ways to make a good selection),
1196
+ <span class='line'>1189</span> * &lt;i>bad&lt;/i> (ways to make a bad selection), and &lt;i>samples&lt;/i> (number of items sampled, which is less than or equal to &lt;i>good + bad&lt;/i>).
1197
+ <span class='line'>1190</span> * &lt;p>
1198
+ <span class='line'>1191</span> * Naive implementation with runtime &lt;i>O(samples)&lt;/i>.
1199
+ <span class='line'>1192</span> *
1200
+ <span class='line'>1193</span> * @param {Number} good ways to make a good selection
1201
+ <span class='line'>1194</span> * @param {Number} bad ways to make a bad selection
1202
+ <span class='line'>1195</span> * @param {Number} samples number of items sampled
1203
+ <span class='line'>1196</span> * @returns
1204
+ <span class='line'>1197</span> * @memberof JXG.Math.Statistics
1205
+ <span class='line'>1198</span> */</span><span class="WHIT">
1206
+ <span class='line'>1199</span> </span><span class="WHIT"> </span><span class="NAME">randomHypergeometric</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">good</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1207
+ <span class='line'>1200</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">,</span><span class="WHIT">
1208
+ <span class='line'>1201</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
1209
+ <span class='line'>1202</span> </span><span class="WHIT"> </span><span class="COMM">// kk,</span><span class="WHIT">
1210
+ <span class='line'>1203</span> </span><span class="WHIT"> </span><span class="COMM">// n = good + bad,</span><span class="WHIT">
1211
+ <span class='line'>1204</span> </span><span class="WHIT"> </span><span class="NAME">d1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">,</span><span class="WHIT">
1212
+ <span class='line'>1205</span> </span><span class="WHIT"> </span><span class="NAME">d2</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.min</span><span class="PUNC">(</span><span class="NAME">good</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
1213
+ <span class='line'>1206</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">d2</span><span class="PUNC">;</span><span class="WHIT">
1214
1214
  <span class='line'>1207</span>
1215
- <span class='line'>1208</span> </span><span class="WHIT"> </span><span class="COMM">// Naive method</span><span class="WHIT">
1216
- <span class='line'>1209</span> </span><span class="WHIT"> </span><span class="COMM">// kk = Math.min(k, n - k);</span><span class="WHIT">
1217
- <span class='line'>1210</span> </span><span class="WHIT"> </span><span class="COMM">// for (i = 0; i &lt; k; i ++) {</span><span class="WHIT">
1218
- <span class='line'>1211</span> </span><span class="WHIT"> </span><span class="COMM">// u = Math.random();</span><span class="WHIT">
1219
- <span class='line'>1212</span> </span><span class="WHIT"> </span><span class="COMM">// if (n * u &lt;= good) {</span><span class="WHIT">
1220
- <span class='line'>1213</span> </span><span class="WHIT"> </span><span class="COMM">// x += 1;</span><span class="WHIT">
1221
- <span class='line'>1214</span> </span><span class="WHIT"> </span><span class="COMM">// if (x === good) {</span><span class="WHIT">
1222
- <span class='line'>1215</span> </span><span class="WHIT"> </span><span class="COMM">// return x;</span><span class="WHIT">
1223
- <span class='line'>1216</span> </span><span class="WHIT"> </span><span class="COMM">// }</span><span class="WHIT">
1224
- <span class='line'>1217</span> </span><span class="WHIT"> </span><span class="COMM">// good -= 1;</span><span class="WHIT">
1225
- <span class='line'>1218</span> </span><span class="WHIT"> </span><span class="COMM">// }</span><span class="WHIT">
1226
- <span class='line'>1219</span> </span><span class="WHIT"> </span><span class="COMM">// n -= 1;</span><span class="WHIT">
1227
- <span class='line'>1220</span> </span><span class="WHIT"> </span><span class="COMM">// }</span><span class="WHIT">
1228
- <span class='line'>1221</span> </span><span class="WHIT"> </span><span class="COMM">// return x;</span><span class="WHIT">
1229
- <span class='line'>1222</span>
1230
- <span class='line'>1223</span> </span><span class="WHIT"> </span><span class="COMM">// Implementation from</span><span class="WHIT">
1231
- <span class='line'>1224</span> </span><span class="WHIT"> </span><span class="COMM">// Monte Carlo by George S. Fishman</span><span class="WHIT">
1232
- <span class='line'>1225</span> </span><span class="WHIT"> </span><span class="COMM">// https://link.springer.com/book/10.1007/978-1-4757-2553-7</span><span class="WHIT">
1233
- <span class='line'>1226</span> </span><span class="WHIT"> </span><span class="COMM">// page 218</span><span class="WHIT">
1234
- <span class='line'>1227</span> </span><span class="WHIT"> </span><span class="COMM">//</span><span class="WHIT">
1235
- <span class='line'>1228</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">;</span><span class="WHIT">
1236
- <span class='line'>1229</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1237
- <span class='line'>1230</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1238
- <span class='line'>1231</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">d1</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1239
- <span class='line'>1232</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1240
- <span class='line'>1233</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1241
- <span class='line'>1234</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">d2</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
1242
- <span class='line'>1235</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1243
- <span class='line'>1236</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
1244
- <span class='line'>1237</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1245
- <span class='line'>1238</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
1246
- <span class='line'>1239</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1247
- <span class='line'>1240</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1248
- <span class='line'>1241</span>
1249
- <span class='line'>1242</span> </span><span class="WHIT"> </span><span class="COMM">/**
1250
- <span class='line'>1243</span> * Compute the histogram of a dataset.
1251
- <span class='line'>1244</span> * Optional parameters can be supplied through a JavaScript object
1252
- <span class='line'>1245</span> * with the following default values:
1253
- <span class='line'>1246</span> * &lt;pre>
1254
- <span class='line'>1247</span> * {
1255
- <span class='line'>1248</span> * bins: 10, // Number of bins
1256
- <span class='line'>1249</span> * range: false, // false or array. The lower and upper range of the bins.
1257
- <span class='line'>1250</span> * // If not provided, range is simply [min(x), max(x)].
1258
- <span class='line'>1251</span> * // Values outside the range are ignored.
1259
- <span class='line'>1252</span> * density: false, // If true, normalize the counts by dividing by sum(counts)
1260
- <span class='line'>1253</span> * cumulative: false
1261
- <span class='line'>1254</span> * }
1262
- <span class='line'>1255</span> * &lt;/pre>
1263
- <span class='line'>1256</span> * The function returns an array containing two arrays. The first array is of length bins+1
1264
- <span class='line'>1257</span> * containing the start values of the bins. The last entry contains the end values of the last bin.
1265
- <span class='line'>1258</span> * &lt;p>
1266
- <span class='line'>1259</span> * The second array contains the counts of each bin.
1267
- <span class='line'>1260</span> * @param {Array} x
1268
- <span class='line'>1261</span> * @param {Object} opt Optional parameters
1269
- <span class='line'>1262</span> * @returns Array [bin, counts] Array bins contains start values of bins, array counts contains
1270
- <span class='line'>1263</span> * the number of entries of x which are contained in each bin.
1271
- <span class='line'>1264</span> * @memberof JXG.Math.Statistics
1272
- <span class='line'>1265</span> *
1273
- <span class='line'>1266</span> * @example
1274
- <span class='line'>1267</span> * let board = JXG.JSXGraph.initBoard('jxgbox',
1275
- <span class='line'>1268</span> * { boundingbox: [-1.7, .5, 20, -.03], axis: true});
1276
- <span class='line'>1269</span> * let board2 = JXG.JSXGraph.initBoard('jxgbox2',
1277
- <span class='line'>1270</span> * { boundingbox: [-1.6, 1.1, 20, -.06], axis: true});
1278
- <span class='line'>1271</span> *
1279
- <span class='line'>1272</span> * let runs = [
1280
- <span class='line'>1273</span> * [0.5, 1.0, 'brown'],
1281
- <span class='line'>1274</span> * [1.0, 2.0, 'red'],
1282
- <span class='line'>1275</span> * [2.0, 2.0, 'orange'],
1283
- <span class='line'>1276</span> * [3.0, 2.0, 'yellow'],
1284
- <span class='line'>1277</span> * [5.0, 1.0, 'green'],
1285
- <span class='line'>1278</span> * [9.0, 0.5, 'black'],
1286
- <span class='line'>1279</span> * [7.5, 1.0, 'purple'],
1287
- <span class='line'>1280</span> * ]
1288
- <span class='line'>1281</span> *
1289
- <span class='line'>1282</span> * let labelY = .4
1290
- <span class='line'>1283</span> * runs.forEach((run,i) => {
1291
- <span class='line'>1284</span> * board.create('segment',[[7,labelY-(i/50)],[9,labelY-(i/50)]],{strokeColor:run[2]})
1292
- <span class='line'>1285</span> * board.create('text',[10,labelY-(i/50),`k=${run[0]}, &theta;=${run[1]}`])
1293
- <span class='line'>1286</span> *
1294
- <span class='line'>1287</span> * // density
1295
- <span class='line'>1288</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomGamma(run[0],run[1]))
1296
- <span class='line'>1289</span> * let res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: false, range: [0, 20] });
1297
- <span class='line'>1290</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2});
1298
- <span class='line'>1291</span> *
1299
- <span class='line'>1292</span> * // cumulative density
1300
- <span class='line'>1293</span> * res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: true, range: [0, 20] });
1301
- <span class='line'>1294</span> * res[0].unshift(0) // add zero to front so cumulative starts at zero
1302
- <span class='line'>1295</span> * res[1].unshift(0)
1303
- <span class='line'>1296</span> * board2.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2 });
1304
- <span class='line'>1297</span> * })
1305
- <span class='line'>1298</span> *
1306
- <span class='line'>1299</span> *
1307
- <span class='line'>1300</span> * &lt;/pre>&lt;div id="JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302" class="jxgbox" style="width: 300px; height: 300px; float:left;">&lt;/div>
1308
- <span class='line'>1301</span> * &lt;div style='float:left;'>&nbsp;&nbsp;&lt;/div>
1309
- <span class='line'>1302</span> * &lt;div id="JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-2" class="jxgbox" style="width: 300px; height: 300px;">&lt;/div>
1310
- <span class='line'>1303</span> * &lt;script type="text/javascript">
1311
- <span class='line'>1304</span> * {
1312
- <span class='line'>1305</span> * let board = JXG.JSXGraph.initBoard('JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302',
1313
- <span class='line'>1306</span> * { boundingbox: [-1.7, .5, 20, -.03], axis: true});
1314
- <span class='line'>1307</span> * let board2 = JXG.JSXGraph.initBoard('JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-2',
1315
- <span class='line'>1308</span> * { boundingbox: [-1.6, 1.1, 20, -.06], axis: true});
1316
- <span class='line'>1309</span> *
1317
- <span class='line'>1310</span> * let runs = [
1318
- <span class='line'>1311</span> * [0.5, 1.0, 'brown'],
1319
- <span class='line'>1312</span> * [1.0, 2.0, 'red'],
1320
- <span class='line'>1313</span> * [2.0, 2.0, 'orange'],
1321
- <span class='line'>1314</span> * [3.0, 2.0, 'yellow'],
1322
- <span class='line'>1315</span> * [5.0, 1.0, 'green'],
1323
- <span class='line'>1316</span> * [9.0, 0.5, 'black'],
1324
- <span class='line'>1317</span> * [7.5, 1.0, 'purple'],
1325
- <span class='line'>1318</span> * ]
1326
- <span class='line'>1319</span> *
1327
- <span class='line'>1320</span> * let labelY = .4
1328
- <span class='line'>1321</span> * runs.forEach((run,i) => {
1329
- <span class='line'>1322</span> * board.create('segment',[[7,labelY-(i/50)],[9,labelY-(i/50)]],{strokeColor:run[2]})
1330
- <span class='line'>1323</span> * board.create('text',[10,labelY-(i/50),`k=${run[0]}, &theta;=${run[1]}`])
1331
- <span class='line'>1324</span> *
1332
- <span class='line'>1325</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomGamma(run[0],run[1]))
1333
- <span class='line'>1326</span> * let res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: false, range: [0, 20] });
1334
- <span class='line'>1327</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2});
1215
+ <span class='line'>1208</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1216
+ <span class='line'>1209</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">NaN</span><span class="PUNC">;</span><span class="WHIT">
1217
+ <span class='line'>1210</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1218
+ <span class='line'>1211</span>
1219
+ <span class='line'>1212</span> </span><span class="WHIT"> </span><span class="COMM">// Naive method</span><span class="WHIT">
1220
+ <span class='line'>1213</span> </span><span class="WHIT"> </span><span class="COMM">// kk = Math.min(k, n - k);</span><span class="WHIT">
1221
+ <span class='line'>1214</span> </span><span class="WHIT"> </span><span class="COMM">// for (i = 0; i &lt; k; i ++) {</span><span class="WHIT">
1222
+ <span class='line'>1215</span> </span><span class="WHIT"> </span><span class="COMM">// u = Math.random();</span><span class="WHIT">
1223
+ <span class='line'>1216</span> </span><span class="WHIT"> </span><span class="COMM">// if (n * u &lt;= good) {</span><span class="WHIT">
1224
+ <span class='line'>1217</span> </span><span class="WHIT"> </span><span class="COMM">// x += 1;</span><span class="WHIT">
1225
+ <span class='line'>1218</span> </span><span class="WHIT"> </span><span class="COMM">// if (x === good) {</span><span class="WHIT">
1226
+ <span class='line'>1219</span> </span><span class="WHIT"> </span><span class="COMM">// return x;</span><span class="WHIT">
1227
+ <span class='line'>1220</span> </span><span class="WHIT"> </span><span class="COMM">// }</span><span class="WHIT">
1228
+ <span class='line'>1221</span> </span><span class="WHIT"> </span><span class="COMM">// good -= 1;</span><span class="WHIT">
1229
+ <span class='line'>1222</span> </span><span class="WHIT"> </span><span class="COMM">// }</span><span class="WHIT">
1230
+ <span class='line'>1223</span> </span><span class="WHIT"> </span><span class="COMM">// n -= 1;</span><span class="WHIT">
1231
+ <span class='line'>1224</span> </span><span class="WHIT"> </span><span class="COMM">// }</span><span class="WHIT">
1232
+ <span class='line'>1225</span> </span><span class="WHIT"> </span><span class="COMM">// return x;</span><span class="WHIT">
1233
+ <span class='line'>1226</span>
1234
+ <span class='line'>1227</span> </span><span class="WHIT"> </span><span class="COMM">// Implementation from</span><span class="WHIT">
1235
+ <span class='line'>1228</span> </span><span class="WHIT"> </span><span class="COMM">// Monte Carlo by George S. Fishman</span><span class="WHIT">
1236
+ <span class='line'>1229</span> </span><span class="WHIT"> </span><span class="COMM">// https://link.springer.com/book/10.1007/978-1-4757-2553-7</span><span class="WHIT">
1237
+ <span class='line'>1230</span> </span><span class="WHIT"> </span><span class="COMM">// page 218</span><span class="WHIT">
1238
+ <span class='line'>1231</span> </span><span class="WHIT"> </span><span class="COMM">//</span><span class="WHIT">
1239
+ <span class='line'>1232</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">;</span><span class="WHIT">
1240
+ <span class='line'>1233</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1241
+ <span class='line'>1234</span> </span><span class="WHIT"> </span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1242
+ <span class='line'>1235</span> </span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">u</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">d1</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1243
+ <span class='line'>1236</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1244
+ <span class='line'>1237</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1245
+ <span class='line'>1238</span> </span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">d2</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
1246
+ <span class='line'>1239</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">good</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">bad</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1247
+ <span class='line'>1240</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
1248
+ <span class='line'>1241</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1249
+ <span class='line'>1242</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
1250
+ <span class='line'>1243</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1251
+ <span class='line'>1244</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
1252
+ <span class='line'>1245</span>
1253
+ <span class='line'>1246</span> </span><span class="WHIT"> </span><span class="COMM">/**
1254
+ <span class='line'>1247</span> * Compute the histogram of a dataset.
1255
+ <span class='line'>1248</span> * Optional parameters can be supplied through a JavaScript object
1256
+ <span class='line'>1249</span> * with the following default values:
1257
+ <span class='line'>1250</span> * &lt;pre>
1258
+ <span class='line'>1251</span> * {
1259
+ <span class='line'>1252</span> * bins: 10, // Number of bins
1260
+ <span class='line'>1253</span> * range: false, // false or array. The lower and upper range of the bins.
1261
+ <span class='line'>1254</span> * // If not provided, range is simply [min(x), max(x)].
1262
+ <span class='line'>1255</span> * // Values outside the range are ignored.
1263
+ <span class='line'>1256</span> * density: false, // If true, normalize the counts by dividing by sum(counts)
1264
+ <span class='line'>1257</span> * cumulative: false
1265
+ <span class='line'>1258</span> * }
1266
+ <span class='line'>1259</span> * &lt;/pre>
1267
+ <span class='line'>1260</span> * The function returns an array containing two arrays. The first array is of length bins+1
1268
+ <span class='line'>1261</span> * containing the start values of the bins. The last entry contains the end values of the last bin.
1269
+ <span class='line'>1262</span> * &lt;p>
1270
+ <span class='line'>1263</span> * The second array contains the counts of each bin.
1271
+ <span class='line'>1264</span> * @param {Array} x
1272
+ <span class='line'>1265</span> * @param {Object} opt Optional parameters
1273
+ <span class='line'>1266</span> * @returns Array [bin, counts] Array bins contains start values of bins, array counts contains
1274
+ <span class='line'>1267</span> * the number of entries of x which are contained in each bin.
1275
+ <span class='line'>1268</span> * @memberof JXG.Math.Statistics
1276
+ <span class='line'>1269</span> *
1277
+ <span class='line'>1270</span> * @example
1278
+ <span class='line'>1271</span> * let board = JXG.JSXGraph.initBoard('jxgbox',
1279
+ <span class='line'>1272</span> * { boundingbox: [-1.7, .5, 20, -.03], axis: true});
1280
+ <span class='line'>1273</span> * let board2 = JXG.JSXGraph.initBoard('jxgbox2',
1281
+ <span class='line'>1274</span> * { boundingbox: [-1.6, 1.1, 20, -.06], axis: true});
1282
+ <span class='line'>1275</span> *
1283
+ <span class='line'>1276</span> * let runs = [
1284
+ <span class='line'>1277</span> * [0.5, 1.0, 'brown'],
1285
+ <span class='line'>1278</span> * [1.0, 2.0, 'red'],
1286
+ <span class='line'>1279</span> * [2.0, 2.0, 'orange'],
1287
+ <span class='line'>1280</span> * [3.0, 2.0, 'yellow'],
1288
+ <span class='line'>1281</span> * [5.0, 1.0, 'green'],
1289
+ <span class='line'>1282</span> * [9.0, 0.5, 'black'],
1290
+ <span class='line'>1283</span> * [7.5, 1.0, 'purple'],
1291
+ <span class='line'>1284</span> * ]
1292
+ <span class='line'>1285</span> *
1293
+ <span class='line'>1286</span> * let labelY = .4
1294
+ <span class='line'>1287</span> * runs.forEach((run,i) => {
1295
+ <span class='line'>1288</span> * board.create('segment',[[7,labelY-(i/50)],[9,labelY-(i/50)]],{strokeColor:run[2]})
1296
+ <span class='line'>1289</span> * board.create('text',[10,labelY-(i/50),`k=${run[0]}, &theta;=${run[1]}`])
1297
+ <span class='line'>1290</span> *
1298
+ <span class='line'>1291</span> * // density
1299
+ <span class='line'>1292</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomGamma(run[0],run[1]))
1300
+ <span class='line'>1293</span> * let res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: false, range: [0, 20] });
1301
+ <span class='line'>1294</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2});
1302
+ <span class='line'>1295</span> *
1303
+ <span class='line'>1296</span> * // cumulative density
1304
+ <span class='line'>1297</span> * res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: true, range: [0, 20] });
1305
+ <span class='line'>1298</span> * res[0].unshift(0) // add zero to front so cumulative starts at zero
1306
+ <span class='line'>1299</span> * res[1].unshift(0)
1307
+ <span class='line'>1300</span> * board2.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2 });
1308
+ <span class='line'>1301</span> * })
1309
+ <span class='line'>1302</span> *
1310
+ <span class='line'>1303</span> *
1311
+ <span class='line'>1304</span> * &lt;/pre>&lt;div id="JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302" class="jxgbox" style="width: 300px; height: 300px; float:left;">&lt;/div>
1312
+ <span class='line'>1305</span> * &lt;div style='float:left;'>&nbsp;&nbsp;&lt;/div>
1313
+ <span class='line'>1306</span> * &lt;div id="JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-2" class="jxgbox" style="width: 300px; height: 300px;">&lt;/div>
1314
+ <span class='line'>1307</span> * &lt;script type="text/javascript">
1315
+ <span class='line'>1308</span> * {
1316
+ <span class='line'>1309</span> * let board = JXG.JSXGraph.initBoard('JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302',
1317
+ <span class='line'>1310</span> * { boundingbox: [-1.7, .5, 20, -.03], axis: true});
1318
+ <span class='line'>1311</span> * let board2 = JXG.JSXGraph.initBoard('JXGda56df4d-a5a5-4c87-9ffc-9bbc1b512302-2',
1319
+ <span class='line'>1312</span> * { boundingbox: [-1.6, 1.1, 20, -.06], axis: true});
1320
+ <span class='line'>1313</span> *
1321
+ <span class='line'>1314</span> * let runs = [
1322
+ <span class='line'>1315</span> * [0.5, 1.0, 'brown'],
1323
+ <span class='line'>1316</span> * [1.0, 2.0, 'red'],
1324
+ <span class='line'>1317</span> * [2.0, 2.0, 'orange'],
1325
+ <span class='line'>1318</span> * [3.0, 2.0, 'yellow'],
1326
+ <span class='line'>1319</span> * [5.0, 1.0, 'green'],
1327
+ <span class='line'>1320</span> * [9.0, 0.5, 'black'],
1328
+ <span class='line'>1321</span> * [7.5, 1.0, 'purple'],
1329
+ <span class='line'>1322</span> * ]
1330
+ <span class='line'>1323</span> *
1331
+ <span class='line'>1324</span> * let labelY = .4
1332
+ <span class='line'>1325</span> * runs.forEach((run,i) => {
1333
+ <span class='line'>1326</span> * board.create('segment',[[7,labelY-(i/50)],[9,labelY-(i/50)]],{strokeColor:run[2]})
1334
+ <span class='line'>1327</span> * board.create('text',[10,labelY-(i/50),`k=${run[0]}, &theta;=${run[1]}`])
1335
1335
  <span class='line'>1328</span> *
1336
- <span class='line'>1329</span> * // cumulative density
1337
- <span class='line'>1330</span> * res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: true, range: [0, 20] });
1338
- <span class='line'>1331</span> * res[0].unshift(0) // add zero to front so cumulative starts at zero
1339
- <span class='line'>1332</span> * res[1].unshift(0)
1340
- <span class='line'>1333</span> * board2.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2 });
1341
- <span class='line'>1334</span> * })
1342
- <span class='line'>1335</span> * }
1343
- <span class='line'>1336</span> * &lt;/script>&lt;pre>
1344
- <span class='line'>1337</span> *
1345
- <span class='line'>1338</span> */</span><span class="WHIT">
1346
- <span class='line'>1339</span> </span><span class="WHIT"> </span><span class="NAME">histogram</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opt</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1347
- <span class='line'>1340</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">le</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">,</span><span class="WHIT">
1348
- <span class='line'>1341</span> </span><span class="WHIT"> </span><span class="NAME">mi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ma</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">,</span><span class="WHIT">
1349
- <span class='line'>1342</span> </span><span class="WHIT"> </span><span class="NAME">range</span><span class="PUNC">,</span><span class="WHIT">
1350
- <span class='line'>1343</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">,</span><span class="WHIT">
1351
- <span class='line'>1344</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
1352
- <span class='line'>1345</span> </span><span class="WHIT"> </span><span class="NAME">bins</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1353
- <span class='line'>1346</span>
1354
- <span class='line'>1347</span> </span><span class="WHIT"> </span><span class="COMM">// Evaluate number of bins</span><span class="WHIT">
1355
- <span class='line'>1348</span> </span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">opt.bins</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">;</span><span class="WHIT">
1356
- <span class='line'>1349</span>
1357
- <span class='line'>1350</span> </span><span class="WHIT"> </span><span class="COMM">// Evaluate range</span><span class="WHIT">
1358
- <span class='line'>1351</span> </span><span class="WHIT"> </span><span class="NAME">range</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">opt.range</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
1359
- <span class='line'>1352</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">range</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1360
- <span class='line'>1353</span> </span><span class="WHIT"> </span><span class="NAME">mi</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.min.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1361
- <span class='line'>1354</span> </span><span class="WHIT"> </span><span class="NAME">ma</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.max.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1362
- <span class='line'>1355</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1363
- <span class='line'>1356</span> </span><span class="WHIT"> </span><span class="NAME">mi</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">range</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1364
- <span class='line'>1357</span> </span><span class="WHIT"> </span><span class="NAME">ma</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">range</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1365
- <span class='line'>1358</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1366
- <span class='line'>1359</span>
1367
- <span class='line'>1360</span> </span><span class="WHIT"> </span><span class="COMM">// Set uniform delta</span><span class="WHIT">
1368
- <span class='line'>1361</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">num_bins</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1369
- <span class='line'>1362</span> </span><span class="WHIT"> </span><span class="NAME">delta</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">ma</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">mi</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">num_bins</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1370
- <span class='line'>1363</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1371
- <span class='line'>1364</span> </span><span class="WHIT"> </span><span class="NAME">delta</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1372
- <span class='line'>1365</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1373
- <span class='line'>1366</span>
1374
- <span class='line'>1367</span> </span><span class="WHIT"> </span><span class="COMM">// Set the bins and init the counts array</span><span class="WHIT">
1375
- <span class='line'>1368</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1376
- <span class='line'>1369</span> </span><span class="WHIT"> </span><span class="NAME">counts.push</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1377
- <span class='line'>1370</span> </span><span class="WHIT"> </span><span class="NAME">bins.push</span><span class="PUNC">(</span><span class="NAME">mi</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1378
- <span class='line'>1371</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1379
- <span class='line'>1372</span> </span><span class="WHIT"> </span><span class="COMM">// bins.push(ma);</span><span class="WHIT">
1380
- <span class='line'>1373</span>
1381
- <span class='line'>1374</span> </span><span class="WHIT"> </span><span class="COMM">// Determine the counts</span><span class="WHIT">
1382
- <span class='line'>1375</span> </span><span class="WHIT"> </span><span class="NAME">le</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">x.length</span><span class="PUNC">;</span><span class="WHIT">
1383
- <span class='line'>1376</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">le</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1384
- <span class='line'>1377</span> </span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">mi</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1385
- <span class='line'>1378</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1386
- <span class='line'>1379</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1387
- <span class='line'>1380</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1388
- <span class='line'>1381</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1389
- <span class='line'>1382</span>
1390
- <span class='line'>1383</span> </span><span class="WHIT"> </span><span class="COMM">// Normalize if density===true</span><span class="WHIT">
1391
- <span class='line'>1384</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opt.density</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1392
- <span class='line'>1385</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">JXG.Math.Statistics.sum</span><span class="PUNC">(</span><span class="NAME">counts</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1393
- <span class='line'>1386</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1394
- <span class='line'>1387</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1395
- <span class='line'>1388</span> </span><span class="WHIT"> </span><span class="COMM">// counts[i] /= s;</span><span class="WHIT">
1396
- <span class='line'>1389</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1397
- <span class='line'>1390</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1398
- <span class='line'>1391</span>
1399
- <span class='line'>1392</span> </span><span class="WHIT"> </span><span class="COMM">// Cumulative counts</span><span class="WHIT">
1400
- <span class='line'>1393</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opt.cumulative</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1401
- <span class='line'>1394</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opt.density</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1402
- <span class='line'>1395</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1403
- <span class='line'>1396</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// normalize</span><span class="WHIT">
1404
- <span class='line'>1397</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1405
- <span class='line'>1398</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1406
- <span class='line'>1399</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1407
- <span class='line'>1400</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1408
- <span class='line'>1401</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1409
- <span class='line'>1402</span>
1410
- <span class='line'>1403</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">counts</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">bins</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1411
- <span class='line'>1404</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1412
- <span class='line'>1405</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
1413
- <span class='line'>1406</span>
1414
- <span class='line'>1407</span> </span><span class="NAME">export</span><span class="WHIT"> </span><span class="KEYW">default</span><span class="WHIT"> </span><span class="NAME">Mat.Statistics</span><span class="PUNC">;</span><span class="WHIT">
1415
- <span class='line'>1408</span> </span></pre></body></html>
1336
+ <span class='line'>1329</span> * let x = Array(50000).fill(0).map(() => JXG.Math.Statistics.randomGamma(run[0],run[1]))
1337
+ <span class='line'>1330</span> * let res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: false, range: [0, 20] });
1338
+ <span class='line'>1331</span> * board.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2});
1339
+ <span class='line'>1332</span> *
1340
+ <span class='line'>1333</span> * // cumulative density
1341
+ <span class='line'>1334</span> * res = JXG.Math.Statistics.histogram(x, { bins: 50, density: true, cumulative: true, range: [0, 20] });
1342
+ <span class='line'>1335</span> * res[0].unshift(0) // add zero to front so cumulative starts at zero
1343
+ <span class='line'>1336</span> * res[1].unshift(0)
1344
+ <span class='line'>1337</span> * board2.create('curve', [res[1], res[0]], { strokeColor: run[2], strokeWidth:2 });
1345
+ <span class='line'>1338</span> * })
1346
+ <span class='line'>1339</span> * }
1347
+ <span class='line'>1340</span> * &lt;/script>&lt;pre>
1348
+ <span class='line'>1341</span> *
1349
+ <span class='line'>1342</span> */</span><span class="WHIT">
1350
+ <span class='line'>1343</span> </span><span class="WHIT"> </span><span class="NAME">histogram</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opt</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1351
+ <span class='line'>1344</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">le</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">,</span><span class="WHIT">
1352
+ <span class='line'>1345</span> </span><span class="WHIT"> </span><span class="NAME">mi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ma</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">,</span><span class="WHIT">
1353
+ <span class='line'>1346</span> </span><span class="WHIT"> </span><span class="NAME">range</span><span class="PUNC">,</span><span class="WHIT">
1354
+ <span class='line'>1347</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">,</span><span class="WHIT">
1355
+ <span class='line'>1348</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
1356
+ <span class='line'>1349</span> </span><span class="WHIT"> </span><span class="NAME">bins</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
1357
+ <span class='line'>1350</span> </span><span class="WHIT"> </span><span class="NAME">no_bin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// Count of long tail elements not in histogram range</span><span class="WHIT">
1358
+ <span class='line'>1351</span>
1359
+ <span class='line'>1352</span> </span><span class="WHIT"> </span><span class="COMM">// Evaluate number of bins</span><span class="WHIT">
1360
+ <span class='line'>1353</span> </span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">opt.bins</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">;</span><span class="WHIT">
1361
+ <span class='line'>1354</span>
1362
+ <span class='line'>1355</span> </span><span class="WHIT"> </span><span class="COMM">// Evaluate range</span><span class="WHIT">
1363
+ <span class='line'>1356</span> </span><span class="WHIT"> </span><span class="NAME">range</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">opt.range</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
1364
+ <span class='line'>1357</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">range</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1365
+ <span class='line'>1358</span> </span><span class="WHIT"> </span><span class="NAME">mi</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.min.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1366
+ <span class='line'>1359</span> </span><span class="WHIT"> </span><span class="NAME">ma</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.max.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1367
+ <span class='line'>1360</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1368
+ <span class='line'>1361</span> </span><span class="WHIT"> </span><span class="NAME">mi</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">range</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1369
+ <span class='line'>1362</span> </span><span class="WHIT"> </span><span class="NAME">ma</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">range</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1370
+ <span class='line'>1363</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1371
+ <span class='line'>1364</span>
1372
+ <span class='line'>1365</span> </span><span class="WHIT"> </span><span class="COMM">// Set uniform delta</span><span class="WHIT">
1373
+ <span class='line'>1366</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">num_bins</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1374
+ <span class='line'>1367</span> </span><span class="WHIT"> </span><span class="NAME">delta</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">ma</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">mi</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">num_bins</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1375
+ <span class='line'>1368</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1376
+ <span class='line'>1369</span> </span><span class="WHIT"> </span><span class="NAME">delta</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
1377
+ <span class='line'>1370</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1378
+ <span class='line'>1371</span>
1379
+ <span class='line'>1372</span> </span><span class="WHIT"> </span><span class="COMM">// Set the bins and init the counts array</span><span class="WHIT">
1380
+ <span class='line'>1373</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1381
+ <span class='line'>1374</span> </span><span class="WHIT"> </span><span class="NAME">counts.push</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1382
+ <span class='line'>1375</span> </span><span class="WHIT"> </span><span class="NAME">bins.push</span><span class="PUNC">(</span><span class="NAME">mi</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1383
+ <span class='line'>1376</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1384
+ <span class='line'>1377</span> </span><span class="WHIT"> </span><span class="COMM">// bins.push(ma);</span><span class="WHIT">
1385
+ <span class='line'>1378</span>
1386
+ <span class='line'>1379</span> </span><span class="WHIT"> </span><span class="COMM">// Determine the counts</span><span class="WHIT">
1387
+ <span class='line'>1380</span> </span><span class="WHIT"> </span><span class="NAME">le</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">x.length</span><span class="PUNC">;</span><span class="WHIT">
1388
+ <span class='line'>1381</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">le</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1389
+ <span class='line'>1382</span> </span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">mi</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1390
+ <span class='line'>1383</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1391
+ <span class='line'>1384</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1392
+ <span class='line'>1385</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1393
+ <span class='line'>1386</span> </span><span class="WHIT"> </span><span class="NAME">no_bin</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
1394
+ <span class='line'>1387</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1395
+ <span class='line'>1388</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1396
+ <span class='line'>1389</span>
1397
+ <span class='line'>1390</span> </span><span class="WHIT"> </span><span class="COMM">// Normalize if density===true</span><span class="WHIT">
1398
+ <span class='line'>1391</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opt.density</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1399
+ <span class='line'>1392</span> </span><span class="WHIT"> </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">JXG.Math.Statistics.sum</span><span class="PUNC">(</span><span class="NAME">counts</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">no_bin</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// Normalize including long tail</span><span class="WHIT">
1400
+ <span class='line'>1393</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1401
+ <span class='line'>1394</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
1402
+ <span class='line'>1395</span> </span><span class="WHIT"> </span><span class="COMM">// counts[i] /= s;</span><span class="WHIT">
1403
+ <span class='line'>1396</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1404
+ <span class='line'>1397</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1405
+ <span class='line'>1398</span>
1406
+ <span class='line'>1399</span> </span><span class="WHIT"> </span><span class="COMM">// Cumulative counts</span><span class="WHIT">
1407
+ <span class='line'>1400</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opt.cumulative</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1408
+ <span class='line'>1401</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">opt.density</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1409
+ <span class='line'>1402</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1410
+ <span class='line'>1403</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">delta</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// Normalize</span><span class="WHIT">
1411
+ <span class='line'>1404</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1412
+ <span class='line'>1405</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">num_bins</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
1413
+ <span class='line'>1406</span> </span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">counts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1414
+ <span class='line'>1407</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1415
+ <span class='line'>1408</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1416
+ <span class='line'>1409</span>
1417
+ <span class='line'>1410</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">counts</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">bins</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
1418
+ <span class='line'>1411</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
1419
+ <span class='line'>1412</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
1420
+ <span class='line'>1413</span>
1421
+ <span class='line'>1414</span> </span><span class="NAME">export</span><span class="WHIT"> </span><span class="KEYW">default</span><span class="WHIT"> </span><span class="NAME">Mat.Statistics</span><span class="PUNC">;</span><span class="WHIT">
1422
+ <span class='line'>1415</span> </span></pre></body></html>