【工程C#】随机数扩展类(新增正态分布、随机数批量生成)

    //随机数类
    public static class RandomEX
    {
        public static double Seed;
        public static int NormSumCount = 12;
        const double s = 65536;
        const double u = 2053;
        const double v = 13849;
        //0~1之间的随机数
        public static  double Uniform()
        {

            int m = (int)(Seed / s);
            Seed = Seed - m * s;
            Seed = u * Seed + v;
            m = (int)(Seed / s);
            Seed = Seed - m * s;
            double p = Seed / s;
            return p;
        }
       
        //0~1之间的随机数列表
        public static List<double> UniformList(int Count)
        {
            List<double> rslt = new List<double>();
             for (int i = 0; i < Count; i++)
            {
                Seed = u * Seed + v;
                int m = (int)(Seed / s);
                Seed = Seed - m * s;
                rslt.Add(Seed / s);
            }
            return rslt;
        }
      
        /// <summary>
        /// 获取整形随机数,必须先选择Seed值,并且Seed值只能是正奇数。
        /// </summary>
        /// <returns></returns>
        public static int  UniInt(int a ,int b)
        {
            int k = b - a + 1;
            int L = 2;
            while (L < k) L += L;
            int m = 4* L;
            k =(int) Seed;
            int i = 1;
            int p=0;
            while (i <= 1)
            {
                k = 5 * k;
                k = k % m;
                L = k / 4 + a;
                if (L <= b)
                {
                    p = L;
                    i++;
                }
                Seed = k;
                
            }
            return p;
        }

        //产生任意区间整形随机数序列,seed必须选择正奇数。
        public static List<int> UniIntList(int a, int b, int n)
        {
            List<int> rslt = new List<int>();
            int k = b - a + 1;
            int L = 2;
            while (L < k) L += L;
            int m = 4 * L;
             k = (int)Seed;
            int i = 0;
            while (i < n)
            {
                k = 5 * k;
                k = k % m;
                L = k / 4 + a;
                if (L <= b)
                {
                    rslt.Add(L);
                    i++;
                }
            }
            Seed = k;
            return rslt;

        }

        //产生正态分布随机数
        public static double Normal(double  miu,double sigma)
        {
            double sum = 0;
            int m;
            for (int i = 0; i < RandomEX.NormSumCount; i++)
            {
                Seed = Seed * u + v;
                m = (int)( Seed /s);
                Seed = Seed - m * s;
                sum += Seed / s;
            }
            sum = miu + sigma * (sum - RandomEX .NormSumCount /2);
            return (sum);
        }

        //生成正态分布随机数列表
        public static List<double> NormalList(double miu, double sigma, double n)
        {
            double sum;
            int m;
            List<double> rslt = new List<double>();
            for(int k=0; k<n;k++)
            {
                sum = 0;
                for (int i=0;i<RandomEX .NormSumCount;i++)
                {
                    Seed = Seed * u + v;
                    m = (int)(Seed / s);
                    Seed -= m * s;
                    sum += Seed / s;
                }
                rslt.Add(miu + sigma * (sum - RandomEX.NormSumCount / 2));
            }
            return rslt;
        }

        public static double  Randomize( bool isOddOnly=true )
        {
            int curseed = DateTime.Now.Millisecond;
            if (isOddOnly)
                curseed = curseed * 2 - 1;
            Seed = curseed;
            return Seed;
        }
    }//随机数类结束

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值