c# 实现模糊PID控制算法

跑起来的效果看每个类的test方法,自己调用来测试

目的是看看哪个算法好用,移植的时候比较单纯没有研究懂算法,代码结构也没改动,只是移植到C#方便查看代码和测试,大家要拷贝也很方便,把整个类拷贝到.cs文件即可

这段算法在实际值低于目标值是工作正常,超过后会有问题,不知道如何调教

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FuzzyPID
{
  class FuzzyPID
  {
    public const int N = 7;

    double target; //系统的控制目标
    double actual; //采样获得的实际值
    double e; //误差
    double e_pre_1; //上一次的误差
    double e_pre_2; //上上次的误差
    double de;   //误差的变化率
    double emax;  //误差基本论域上限
    double demax;  //误差辩化率基本论域的上限
    double delta_Kp_max;  //delta_kp输出的上限
    double delta_Ki_max;  //delta_ki输出上限
    double delta_Kd_max;  //delta_kd输出上限
    double Ke;   //Ke=n/emax,量化论域为[-3,-2,-1,0,1,2,3]
    double Kde;   //Kde=n/demax,量化论域为[-3,-2,-1,0,1,2,3]
    double Ku_p;  //Ku_p=Kpmax/n,量化论域为[-3,-2,-1,0,1,2,3]
    double Ku_i;  //Ku_i=Kimax/n,量化论域为[-3,-2,-1,0,1,2,3]
    double Ku_d;  //Ku_d=Kdmax/n,量化论域为[-3,-2,-1,0,1,2,3]
    int[,] Kp_rule_matrix = new int[N, N];//Kp模糊规则矩阵
    int[,] Ki_rule_matrix = new int[N, N];//Ki模糊规则矩阵
    int[,] Kd_rule_matrix = new int[N, N];//Kd模糊规则矩阵
    string mf_t_e;    //e的隶属度函数类型
    string mf_t_de;   //de的隶属度函数类型
    string mf_t_Kp;   //kp的隶属度函数类型
    string mf_t_Ki;   //ki的隶属度函数类型
    string mf_t_Kd;   //kd的隶属度函数类型
    double[] e_mf_paras; //误差的隶属度函数的参数
    double[] de_mf_paras;//误差的偏差隶属度函数的参数
    double[] Kp_mf_paras; //kp的隶属度函数的参数
    double[] Ki_mf_paras; //ki的隶属度函数的参数
    double[] Kd_mf_paras; //kd的隶属度函数的参数
    double Kp;
    double Ki;
    double Kd;
    double A;
    double B;
    double C;

    public FuzzyPID(double e_max, double de_max, double kp_max, double ki_max, double kd_max, double Kp0, double Ki0, double Kd0)
    {
      emax = e_max;
      demax = de_max;
      delta_Kp_max = kp_max;
      delta_Ki_max = ki_max;
      delta_Kd_max = kd_max;
      e = target - actual;
      de = e - e_pre_1;
      Ke = (N / 2) / emax;
      Kde = (N / 2) / demax;
      Ku_p = delta_Kp_max / (N / 2);
      Ku_i = delta_Ki_max / (N / 2);
      Ku_d = delta_Kd_max / (N / 2);
      Kp = Kp0;
      Ki = Ki0;
      Kd = Kd0;
      A = Kp + Ki + Kd;
      B = -2 * Kd - Kp;
      C = Kd;
    }

    //三角隶属度函数
    double trimf(double x, double a, double b, double c)
    {
      double u;
      if (x >= a && x <= b)
        u = (x - a) / (b - a);
      else if (x > b && x <= c)
        u = (c - x) / (c - b);
      else
        u = 0;
      return u;
    }

    //正态隶属度函数
    double gaussmf(double x, double ave, double sigma)
    {
      double u;
      if (sigma < 0)
      {
        throw new Exception("In gaussmf, sigma must larger than 0");
      }
      u = Math.Exp(-Math.Pow(((x - ave) / sigma), 2));
      return u;
    }

    //梯形隶属度函数
    double trapmf(double x, double a, double b, double c, double d)
    {
      double u;
      if (x >= a && x < b)
        u = (x - a) / (b - a);
      else if (x >= b && x < c)
        u = 1;
      else if (x >= c && x <= d)
        u = (d - x) / (d - c);
      else
        u = 0;
      return u;
    }

    //设置模糊规则Matrix
    public void setRuleMatrix(int[,] kp_m, int[,] ki_m, int[,] kd_m)
    {
      for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
          Kp_rule_matrix[i, j] = kp_m[i, j];
          Ki_rule_matrix[i, j] = ki_m[i, j];
          Kd_rule_matrix[i, j] = kd_m[i, j];
        }

    }

    //设置模糊隶属度函数的子函数
    void setMf_sub(string type, double[] paras, int n)
    {
      int N_mf_e = 0, N_mf_de = 0, N_mf_Kp = 0, N_mf_Ki = 0, N_mf_Kd = 0;
      switch (n)
      {
        case 0:
          if (type == "trimf" || type == "gaussmf" || type == "trapmf")
            mf_t_e = type;
          else
            throw new Exception("Type of membership function must be \"trimf\" or \"gaussmf\" or \"trapmf\"");
          if (mf_t_e == "trimf")
            N_mf_e = 3;
          else if (mf_t_e == "gaussmf")
            N_mf_e = 2;
          else if (mf_t_e == "trapmf")
            N_mf_e = 4;

          e_mf_paras = new double[N * N_mf_e];
          for (int i = 0; i < N * N_mf_e; i++)
            e_mf_paras[i] = paras[i];
          break;

        case 1:
          if (type == "trimf" || type == "gaussmf" || type == "trapmf")
            mf_t_de = type;
          else
            throw new Exception("Type of membership function must be \"trimf\" or \"gaussmf\" or \"trapmf\"");
          if (mf_t_de == "trimf")
            N_mf_de = 3;
          else if (mf_t_de == "gaussmf")
            N_mf_de = 2;
          else if (mf_t_de == "trapmf")
            N_mf_de = 4;
          de_mf_paras = new double[N * N_mf_de];
          for (int i = 0; i < N * N_mf_de; i++)
            de_mf_paras[i] = paras[i];
          break;

        case 2:
          if (type == "trimf" || type == "gaussmf" || type == "trapmf")
            mf_t_Kp = type;
          else
            throw new Exception("Type of membership function must be \"trimf\" or \"gaussmf\" or \"trapmf\"");
          if (mf_t_Kp == "trimf")
            N_mf_Kp = 3;
          else if (mf_t_Kp == "gaussmf")
            N_mf_Kp = 2;
          else if (mf_t_Kp == "trapmf")
            N_mf_Kp = 4;
          Kp_mf_paras = new double[N * N_mf_Kp];
          for (int i = 0; i < N * N_mf_Kp; i++)
            Kp_mf_paras[i] = paras[i];
          break;

        case 3:
          if (type == "trimf" || type == "gaussmf" || type == "trapmf")
            mf_t_Ki = type;
          else
            throw new Exception("Type of membership function must be \"trimf\" or \"gaussmf\" or \"trapmf\"");
          if (mf_t_Ki == "trimf")
            N_mf_Ki = 3;
          else if (mf_t_Ki == "gaussmf")
            N_mf_Ki = 2;
          else if (mf_t_Ki == "trapmf")
            N_mf_Ki = 4;
          Ki_mf_paras = new double[N * N_mf_Ki];
          for (int i = 0; i < N * N_mf_Ki; i++)
            Ki_mf_paras[i] = paras[i];
          break;

        case 4:
          if (type == "trimf" || type == "gaussmf" || type == "trapmf")
            mf_t_Kd = type;
          else
            throw new Exception("Type of membership function must be \"trimf\" or \"gaussmf\" or \"trapmf\"");
          if (mf_t_Kd == "trimf")
            N_mf_Kd = 3;
          else if (mf_t_Kd == "gaussmf")
            N_mf_Kd = 2;
          else if (mf_t_Kd == "trapmf")
            N_mf_Kd = 4;
          Kd_mf_paras = new double[N * N_mf_Kd];
          for (int i = 0; i < N * N_mf_Kd; i++)
            Kd_mf_paras[i] = paras[i];
          break;

        default: break;
      }
    }

    //设置模糊隶属度函数的类型和参数
    public void setMf(string mf_type_e, double[] e_mf,
       string mf_type_de, double[] de_mf,
       string mf_type_Kp, double[] Kp_mf,
       string mf_type_Ki, double[] Ki_mf,
       string mf_type_Kd, double[] Kd_mf)
    {
      setMf_sub(mf_type_e, e_mf, 0);
      setMf_sub(mf_type_de, de_mf, 1);
      setMf_sub(mf_type_Kp, Kp_mf, 2);
      setMf_sub(mf_type_Ki, Ki_mf, 3);
      setMf_sub(mf_type_Kd, Kd_mf, 4);
    }

    //实现模糊控制
    public double realize(double t, double a)
    {
      double[] u_e = new double[N],
        u_de = new double[N],
        u_u = new double[N];
      int[] u_e_index = new int[3], u_de_index = new int[3];//假设一个输入最多激活3个模糊子集
      double delta_Kp, delta_Ki, delta_Kd;
      double delta_u;
      target = t;
      actual = a;
      e = target - actual;
      de = e - e_pre_1;
      e = Ke * e;
      de = Kde * de;
      /* 将误差e模糊化*/
      int j = 0;
      for (int i = 0; i < N; i++)
      {
        if (mf_t_e == "trimf")
          u_e[i] = trimf(e, e_mf_paras[i * 3], e_mf_paras[i * 3 + 1], e_mf_paras[i * 3 + 2]);//e模糊化,计算它的隶属度
        else if (mf_t_e == "gaussmf")
          u_e[i] = gaussmf(e, e_mf_paras[i * 2], e_mf_paras[i * 2 + 1]);//e模糊化,计算它的隶属度
        else if (mf_t_e == "trapmf")
          u_e[i] = trapmf(e, e_mf_paras[i * 4], e_mf_paras[i * 4 + 1], e_mf_paras[i * 4 + 2], e_mf_paras[i * 4 + 3]);//e模糊化,计算它的隶属度

        if (u_e[i] != 0)
          u_e_index[j++] = i;        //存储被激活的模糊子集的下标,可以减小计算量
      }
      for (; j < 3; j++) u_e_index[j] = 0;       //富余的空间填0

      /*将误差变化率de模糊化*/
      j = 0;
      for (int i = 0; i < N; i++)
      {
        if (mf_t_de == "trimf")
          u_de[i] = trimf(de, de_mf_paras[i * 3], de_mf_paras[i * 3 + 1], de_mf_paras[i * 3 + 2]);//de模糊化,计算它的隶属度
        else if (mf_t_de == "gaussmf")
          u_de[i] = gaussmf(de, de_mf_paras[i * 2], de_mf_paras[i * 2 + 1]);//de模糊化,计算它的隶属度
        else if (mf_t_de == "trapmf")
          u_de[i] = trapmf(de, de_mf_paras[i * 4], de_mf_paras[i * 4 + 1], de_mf_paras[i * 4 + 2], de_mf_paras[i * 4 + 3]);//de模糊化,计算它的隶属度

        if (u_de[i] != 0)
          u_de_index[j++] = i;      //存储被激活的模糊子集的下标,可以减小计算量
      }
      for (; j < 3; j++) u_de_index[j] = 0;     //富余的空间填0

      double den = 0, num = 0;
      /*计算delta_Kp和Kp*/
      for (int m = 0; m < 3; m++)
        for (int n = 0; n < 3; n++)
        {
          num += u_e[u_e_index[m]] * u_de[u_de_index[n]] * Kp_rule_matrix[u_e_index[m], u_de_index[n]];
          den += u_e[u_e_index[m]] * u_de[u_de_index[n]];
        }
      delta_Kp = num / den;
      delta_Kp = Ku_p * delta_Kp;
      if (delta_Kp >= delta_Kp_max) delta_Kp = delta_Kp_max;
      else if (delta_Kp <= -delta_Kp_max) delta_Kp = -delta_Kp_max;
      Kp += delta_Kp;
      if (Kp < 0) Kp = 0;
      /*计算delta_Ki和Ki*/
      den = 0; num = 0;
      for (int m = 0; m < 3; m++)
        for (int n = 0; n < 3; n++)
        {
          num += u_e[u_e_index[m]] * u_de[u_de_index[n]] * Ki_rule_matrix[u_e_index[m], u_de_index[n]];
          den += u_e[u_e_index[m]] * u_de[u_de_index[n]];
        }

      delta_Ki = num / den;
      delta_Ki = Ku_i * delta_Ki;
      if (delta_Ki >= delta_Ki_max) delta_Ki = delta_Ki_max;
      else if (delta_Ki <= -delta_Ki_max) delta_Ki = -delta_Ki_max;
      Ki += delta_Ki;
      if (Ki < 0) Ki = 0;
      /*计算delta_Kd和Kd*/
      den = 0; num = 0;
      for (int m = 0; m < 3; m++)
        for (int n = 0; n < 3; n++)
        {
          num += u_e[u_e_index[m]] * u_de[u_de_index[n]] * Kd_rule_matrix[u_e_index[m], u_de_index[n]];
          den += u_e[u_e_index[m]] * u_de[u_de_index[n]];
        }
      delta_Kd = num / den;
      delta_Kd = Ku_d * delta_Kd;
      if (delta_Kd >= delta_Kd_max) delta_Kd = delta_Kd_max;
      else if (delta_Kd <= -delta_Kd_max) delta_Kd = -delta_Kd_max;
      Kd += delta_Kd;
      if (Kd < 0) Kd = 0;

      A = Kp + Ki + Kd;
      B = -2 * Kd - Kp;
      C = Kd;
      delta_u = A * e + B * e_pre_1 + C * e_pre_2;

      delta_u = delta_u / Ke;

      if (delta_u >= 0.95 * target) delta_u = 0.95 * target;
      else if (delta_u <= -0.95 * target) delta_u = -0.95 * target;

      e_pre_2 = e_pre_1;
      e_pre_1 = e;

      return delta_u;
    }

    void showMf(string type, double[] mf_paras)
    {
      int tab = 0;
      if (type == "trimf")
        tab = 2;
      else if (type == "gaussmf")
        tab = 1;
      else if (type == "trapmf")
        tab = 3;
      this.WriteLine($"函数类型:{mf_t_e}");
      this.WriteLine("函数参数列表:");
      double[] p = mf_paras;
      for (int i = 0; i < N * (tab + 1); i++)
      {
        this.Write(p[i] + " ");
        if (i % (tab + 1) == tab)
          this.Write("\r\n");
      }
    }

    public void showInfo()
    {
      this.WriteLine("Info of this fuzzy controller is as following:");
      this.WriteLine($"基本论域e:[{-emax},{emax}]");
      this.WriteLine($"基本论域de:[{-demax},{demax}]");
      this.WriteLine($"基本论域delta_Kp:[{-delta_Kp_max},{delta_Kp_max}]");
      this.WriteLine($"基本论域delta_Ki:[{-delta_Ki_max},{delta_Ki_max}]");
      this.WriteLine($"基本论域delta_Kd:[{-delta_Kd_max},{delta_Kd_max}]");
      this.WriteLine("误差e的模糊隶属度函数参数:");
      showMf(mf_t_e, e_mf_paras);
      this.WriteLine("误差变化率de的模糊隶属度函数参数:");
      showMf(mf_t_de, de_mf_paras);
      this.WriteLine("delta_Kp的模糊隶属度函数参数:");
      showMf(mf_t_Kp, Kp_mf_paras);
      this.WriteLine("delta_Ki的模糊隶属度函数参数:");
      showMf(mf_t_Ki, Ki_mf_paras);
      this.WriteLine("delta_Kd的模糊隶属度函数参数:");
      showMf(mf_t_Kd, Kd_mf_paras);
      this.WriteLine("模糊规则表:");
      this.WriteLine("delta_Kp的模糊规则矩阵");
      for (int i = 0; i < N; i++)
      {
        for (int j = 0; j < N; j++)
        {
          this.Write(Kp_rule_matrix[i, j]);
        }
        this.Write("\r\n");
      }
      this.WriteLine("delta_Ki的模糊规则矩阵"); ;
      for (int i = 0; i < N; i++)
      {
        for (int j = 0; j < N; j++)
        {
          this.WriteLine(Ki_rule_matrix[i, j]);
        }
        WriteEnd();
      }
      this.WriteLine("delta_Kd的模糊规则矩阵"); ;
      for (int i = 0; i < N; i++)
      {
        for (int j = 0; j < N; j++)
        {
          this.WriteLine(Kd_rule_matrix[i, j]);
        }
        WriteEnd();
      }
      this.WriteLine($"误差的量化比例因子Ke={Ke}");
      this.WriteLine($"误差变化率的量化比例因子Kde={Kde}");
      this.WriteLine($"输出的量化比例因子Ku_p={Ku_p}");
      this.WriteLine($"输出的量化比例因子Ku_i={Ku_i}");
      this.WriteLine($"输出的量化比例因子Ku_d={Ku_d}");
      this.WriteLine($"设定目标target={target}");
      this.WriteLine($"误差e={e}");
      this.WriteLine($"Kp={Kp}");
      this.WriteLine($"Ki={Ki}");
      this.WriteLine($"Kd={Kd}");
      WriteEnd();
    }

    public void Write(object str)
    {
      Console.Write(str);
    }
    public void WriteLine(object str)
    {
      Console.WriteLine(str);
    }
    public void WriteEnd()
    {
      Console.Write("\r\n");
    }

    public static void test()
    {
      int NB = -3;
      int NM = -2;
      int NS = -1;
      int ZO = 0;
      int PS = 1;
      int PM = 2;
      int PB = 3;

      double target = 300;
      double actual = 400;
      double u = 0;

      int[,] deltaKpMatrix = new int[7, 7] {{PB,PB,PM,PM,PS,ZO,ZO
  },
               {PB,PB,PM,PS,PS,ZO,NS
},
               {PM,PM,PM,PS,ZO,NS,NS},
               {PM,PM,PS,ZO,NS,NM,NM},
               {PS,PS,ZO,NS,NS,NM,NM},
               {PS,ZO,NS,NM,NM,NM,NB},
               {ZO,ZO,NM,NM,NM,NB,NB}};
      int[,] deltaKiMatrix = new int[7, 7]{{NB,NB,NM,NM,NS,ZO,ZO},
               {NB,NB,NM,NS,NS,ZO,ZO},
               {NB,NM,NS,NS,ZO,PS,PS},
               {NM,NM,NS,ZO,PS,PM,PM},
               {NM,NS,ZO,PS,PS,PM,PB},
               {ZO,ZO,PS,PS,PM,PB,PB},
               {ZO,ZO,PS,PM,PM,PB,PB}};
      int[,] deltaKdMatrix = new int[7, 7]{{PS,NS,NB,NB,NB,NM,PS},
               {PS,NS,NB,NM,NM,NS,ZO},
               {ZO,NS,NM,NM,NS,NS,ZO},
               {ZO,NS,NS,NS,NS,NS,ZO},
               {ZO,ZO,ZO,ZO,ZO,ZO,ZO},
               {PB,NS,PS,PS,PS,PS,PB},
               {PB,PM,PM,PM,PS,PS,PB}};
      double[] e_mf_paras = { -3, -3, -2, -3, -2, -1, -2, -1, 0, -1, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 3 };
      double[] de_mf_paras = { -3, -3, -2, -3, -2, -1, -2, -1, 0, -1, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 3 };
      double[] Kp_mf_paras = { -3, -3, -2, -3, -2, -1, -2, -1, 0, -1, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 3 };
      double[] Ki_mf_paras = { -3, -3, -2, -3, -2, -1, -2, -1, 0, -1, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 3 };
      double[] Kd_mf_paras = { -3, -3, -2, -3, -2, -1, -2, -1, 0, -1, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 3 };

      var fuzzypid = new FuzzyPID(1500, 1000, 0.3, 0.9, 0.6, 0.01, 0.04, 0.01);
      fuzzypid.setMf("trimf", e_mf_paras, "trimf", de_mf_paras, "trimf", Kp_mf_paras, "trimf", Ki_mf_paras, "trimf", Kd_mf_paras);
      fuzzypid.setRuleMatrix(deltaKpMatrix, deltaKiMatrix, deltaKdMatrix);

      for (int i = 0; i < 50; i++)
      {
        u = fuzzypid.realize(target, actual);
        actual += u;
        Console.WriteLine($"{i}  {target} {u} {actual}");

        //if (i>19)
        //{
        //  target = 300;
        //}
      }
      //fuzzypid.showInfo();

    }

  }
}

以上就是c# 实现模糊PID控制算法的详细内容,更多关于c# 模糊PID控制算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • 同时兼容JS和C#的RSA加密解密算法详解(对web提交的数据加密传输)

    前言 我们在Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都是收费的),成本较高.那么问题来了,如果对web提交的敏感数据进行加密呢?web应用中,前端的数据处理和交互基本上都是靠javascript来完成,后台的逻辑处理可以C#(java)等进行处理. 微软的C#中虽然有RSA算法,但是格式和OpenSSL生成的公钥/私钥文件格式并不兼容.这个

  • C#字符串自增自减算法详解

    C#实现字符串自增和自减运算,供大家参考,具体内容如下 1.数字从 0-9 变化: 2.字母从 A-Z.a-z 变化: 3.其它字符跳过: 4.以上变化依据其Ascii码值: /// <summary> /// 字符串运算 /// </summary> public class StringOperation { /// <summary> /// 通过ASCII码值,对字符串自增1 /// </summary> /// <param name=&qu

  • C#排序算法之快速排序解析

    本文实例为大家分享了C#实现快速排序的具体代码,供大家参考,具体内容如下 代码: /// <summary> /// 排序 /// </summary> /// <param name="array">要排序的数组</param> /// <param name="low">下标开始位置,向右查找</param> /// <param name="high">下标

  • C#中的那些常用加密算法

    前言 本文主要讲解一下C#常用的那些加密算法. 本文源码 本文所用源码均以为大家整理完毕,大家使用以下方式获取 需要的小伙伴,请关注微信公众号: 程序员零距离, 或者扫描下方公众号二维码,回复关键字:加密算法 , 即可获取本文所用的所有源码资源. 关注上方公众号,回复 加密算法获取 MD5加密 MD5加密是最常见的加密方式,因为MD5是不可逆的,所以很多系统的密码都是用MD5加密保存的. 虽然MD5是不可以解码的,但因为MD5加密的字符串是固定的,所以,理论上只需要建立一个庞大的数据库,把所有的

  • C#实现的二维数组排序算法示例

    本文实例讲述了C#实现的二维数组排序算法.分享给大家供大家参考,具体如下: class Order { /// <summary> /// 对二维数组排序 /// </summary> /// <param name="values">排序的二维数组</param> /// <param name="orderColumnsIndexs">排序根据的列的索引号数组</param> /// <

  • c# 实现位图算法(BitMap)

    算法原理 BitMap的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素.由于采用了Bit为单位来存储数据,因此可以大大节省存储空间. BitMap可以看成一种数据结构. 假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G内存. 在Java中,int占4字节,1字节=8位(1 byte = 8 bit). 如果每个数字用int存储,那就是20亿个int,因而占用的空间约为 (2000000000*4/1024/1024/102

  • 少见的C# RSA算法

    当下最流行的RSA加密算法,只有公钥和私钥同时拥有才能破解加密信息,RSA加密算法的出现有利于数据安全性传输 1.C#中自带RSACryptoServiceProvider类可以让你很好的生成XML格式的公钥和私钥,两句代码就搞定 2.但是生成的XML格式前端不能很好的利用和读懂,所以在生成的XML格式里需要转换成PEM格式,这样才能直接Copy到验证工具里加密解密,非常方便 首先,我们先导入一个第三方库,因为下面涉及到的转换代码都是需要依赖这个库来实现,导入操作如下 控制台里输入 PM > I

  • C#实现拼手气红包算法

    本文实例为大家分享了C#实现拼手气红包算法的具体代码,供大家参考,具体内容如下 一.方案1:即开即中,考虑机会均等,减少金额差较大的几率 可以每次点击时候,随机产生 static double[] GetRandomMoney(double money, int n) { double[] array = new double[n]; RedPackage red = new RedPackage() { money = money, count = n }; for (int i = 0; i

  • C#实现简单的RSA非对称加密算法示例

    本文实例讲述了C#实现简单的RSA非对称加密算法.分享给大家供大家参考,具体如下: 界面控件 namespace RSA算法 { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源. /// </summary

  • 经典实例讲解C#递归算法

    一 .递归算法简介 在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法. 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身. (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口. (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低.所以一般不提倡用递归算法设计程序. (4) 在递归调用的过程当中

随机推荐