コード例 #1
0
        /// <summary>
        ///   Generates a random vector of observations from the current distribution.
        /// </summary>
        ///
        /// <returns>
        ///   A random vector of observations drawn from this distribution.
        /// </returns>
        ///
        public double Generate()
        {
            uint jz = u.Next();
            uint iz = (jz & 255);

            if (jz < ke[iz])
            {
                return(jz * we[iz]);
            }

            for (; ;)
            {
                if (iz == 0)
                {
                    return(7.69711 - Math.Log(u.Generate()));
                }

                double x = jz * we[iz];

                if (fe[iz] + u.Generate() * (fe[iz - 1] - fe[iz]) < Math.Exp(-x))
                {
                    return(x);
                }

                jz = u.Next();
                iz = jz & 255;

                if (jz < ke[iz])
                {
                    return(jz * we[iz]);
                }
            }

            //throw new InvalidOperationException("Execution should not reach here.");
        }
コード例 #2
0
        /// <summary>
        ///   Generates a random vector of observations from the current distribution.
        /// </summary>
        ///
        /// <returns>
        ///   A random vector of observations drawn from this distribution.
        /// </returns>
        ///
        public double Generate()
        {
            const double r = 3.442620;

            int  hz = (int)u.Next();
            uint iz = (uint)(hz & 127);

            if (Math.Abs(hz) < kn[iz])
            {
                return(hz * wn[iz]);
            }

            for (; ;)
            {
                double x;
                double y;

                if (iz == 0)
                {
                    for (; ;)
                    {
                        x = -0.2904764 * Math.Log(u.Generate());
                        y = -Math.Log(u.Generate());
                        if (x * x <= y + y)
                        {
                            break;
                        }
                    }

                    if (hz <= 0)
                    {
                        return(-r - x);
                    }
                    return(+r + x);
                }

                x = hz * wn[iz];

                if (fn[iz] + u.Generate() * (fn[iz - 1] - fn[iz]) < Math.Exp(-0.5 * x * x))
                {
                    return(x);
                }

                hz = (int)u.Next();
                iz = (uint)(hz & 127);

                if (Math.Abs(hz) < kn[iz])
                {
                    return(hz * wn[iz]);
                }
            }

            // throw new InvalidOperationException("Execution should not reach here.");
        }
コード例 #3
0
 public double Generate()
 {
     return(u.Generate() * Length + Min);
 }