c# 取随机数

来源:互联网 发布:串口调试助手发送数据 编辑:程序博客网 时间:2024/05/30 23:04

Random类提供的产生随机数方法有时不能满足要求,常用的只是产生随机整数或者0-1直接的小数,总结另外几种产生随机数的方法:

 

        private Random rr = new Random();

 //返回low与high之间的number个随机整数
        public int[] RandInt(int low, int high, int number)
        {
            int[] randnumber;
            randnumber = new int[number];
            for (int i = 0; i < number; i++)
                randnumber[i] = rr.Next() % (high - low + 1) + low;
            return randnumber;
        }

   //返回low与high之间的number个不同的随机整数

        public int[] RandDifferInt(int low, int high, int number)
        {
            if (number > (high - low + 1))
                number = high - low + 1;
            int[] randvec;
            randvec = new int[number];
            randvec[0] = rr.Next() % (high - low + 1) + low;
            int randi;
            bool IsDiffer;
            for (int i = 1; i < randvec.GetLength(0); i++)
            {
                while (true)
                {
                    randi = rr.Next() % (high - low + 1) + low;
                    IsDiffer = true;
                    for (int j = 0; j < i; j++)
                    {
                        if (randi == randvec[j])
                        {
                            IsDiffer = false;
                            break;
                        }
                    }
                    if (IsDiffer)
                    {
                        randvec[i] = randi;
                        break;
                    }
                }
            }
            return randvec;
        }

 

 3 // 产生freMin到freMax之间N个随机小数,小数的间隔freInter范围自己设定

        //频点个数

        int freNum = (int)((freMax - freMin) / freInter);

        //群体矩阵

        int[] Buf = new int[N];

        //产生初始种群,频点
        Buf = RandInt(1, freNum, N);
        //产生随机的小数
        for (int j = 0; j < N; j++)
        {
             fre[i, j] = (Buf[j] - 1) * freInter + freMin;

        }

 

 4 // 如果产生的随机数频段内想去除几个不可用频段,或者想去除固定的几个随机数(不想产生这几个随机数)。nofreuse是一个list变量,里面依次存放不可用区间范围,如100-200范围内120-140,160-180不可用,则nofreuse存储依次为120,140,160,180。

            //不可用频段范围(本方法中暂时没有用到)
            double[][] NoFre = new double[nofreuse.Count / 2][];
            int nofrecount = 0;
            for (int i = 0; i < (nofreuse.Count / 2); i++)
            {
                double[] db = new double[2] { nofreuse[nofrecount], nofreuse[nofrecount + 1] };
                NoFre[i] = db;
                nofrecount += 2;
            }
            //可用频段范围
            nofrecount = 0;
            double[][] CanUseFre = new double[(nofreuse.Count / 2) + 1][];
            for (int i = 0; i < (nofreuse.Count / 2); i++)
            {
                double[] db;
                if (i == 0)
                {
                    db = new double[2] { fre_min, nofreuse[nofrecount] };
                    nofrecount++;
                }
                else
                {
                    db = new double[2] { nofreuse[nofrecount], nofreuse[nofrecount + 1] };
                    nofrecount += 2;
                }
                CanUseFre[i] = db;
            }

            double[] ddb = new double[2] { nofreuse[nofrecount], fre_max};
            CanUseFre[(nofreuse.Count / 2)] = ddb;

            //以上将可用区间范围和不可用区间范围分别存在了CanUseFre和NoFre里面

            //产生频段的随机数,决定在哪个频段内产生频点
            indiv = randnumber.RandInt(1, CanUseFre.Count(), N);
            for (int j = 0; j < N; j++)
            {
                 int low = (int)((CanUseFre[indiv[j] - 1][0] - freMin) / freInter);
                 int high = (int)((CanUseFre[indiv[j] - 1][1] - freMin) / freInter);
                 Buf[i, j] = randnumber.RandoneInt(low, high);
            }

            //根据产生的频点算出具体的随机数

            for (int j = 0; j < N; j++)
            {
                 fre[i, j] = (Buf[i, j] - 1) * freInter + freMin;
                 //判断里面是否有想去除的随机数,codeHelper.pop_Fre_car里面存放着想去除的随机数

                 bool flag = true;
                 while (true)
                 {
                     for (int k = 0; k < codeHelper.pop_Fre_car.Count(); k++)
                     {
                         if (fre[i, j] == codeHelper.pop_Fre_car[k])
                         {
                             flag = false;
                             break;
                         }
                     }

                     //如果产生了不想要的随机数,则重新产生
                     if (flag == false)
                     {
                         int ind = randnumber.RandoneInt(1, CanUseFre.Count());
                         int low = (int)((CanUseFre[ind - 1][0] - freMin) / freInter);
                         int high = (int)((CanUseFre[ind - 1][1] - freMin) / freInter);
                         int buf = randnumber.RandoneInt(low, high);
                         fre[i, j] = (buf - 1) * freInter + freMin;
                     }
                     if (flag == true)
                         break;
                 }
             }