~~
~~ Licensed to the Apache Software Foundation (ASF) under one or more
~~ contributor license agreements.  See the NOTICE file distributed with
~~ this work for additional information regarding copyright ownership.
~~ The ASF licenses this file to You under the Apache License, Version 2.0
~~ (the "License"); you may not use this file except in compliance with
~~ the License.  You may obtain a copy of the License at
~~
~~      http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing, software
~~ distributed under the License is distributed on an "AS IS" BASIS,
~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~~ See the License for the specific language governing permissions and
~~ limitations under the License.
~~

  -----------------------------
  Using RNG to approximate the probability density of distributions
  -----------------------------

  The samplers provided in package <<<org.apache.commons.rng.sampling.distribution>>>
  have been used to generate histogram data for the following figures.

[../images/userguide/dist_density_approx/uniform.png]

[../images/userguide/dist_density_approx/gauss.ziggurat.png]

[../images/userguide/dist_density_approx/lognormal.ziggurat.png]

[../images/userguide/dist_density_approx/exp.png]

[../images/userguide/dist_density_approx/gamma.case1.png]

[../images/userguide/dist_density_approx/gamma.case2.png]

[../images/userguide/dist_density_approx/beta.case1.png]

[../images/userguide/dist_density_approx/beta.case2.png]

[../images/userguide/dist_density_approx/pareto.png]

[../images/userguide/dist_density_approx/levy.png]

[../images/userguide/dist_density_approx/stable.png]

[../images/userguide/dist_density_approx/t.png]
