通用的抽奖算法

结合网上的算法,记录下来备用。

暂定抽奖分为三个奖项,每一个奖项的概率、数量可以控制。当一个奖项的数量为0的时候,该奖项的中奖概率自动变为0。确保奖项不会超出预算。每人每天限制抽奖次数,每天可以抽n次。中奖后的人员必须填写姓名和电话,填写完成,奖品自动减1。如果你是做长线活动的,活动还做了特殊处理,当一个用户中奖次数超过或等于2的时候就不能再中奖了,但是他每天还是可以抽奖,保证了公众账号的活动的活跃度。如果分享到朋友圈,朋友没有关注,参加不了活动,会自动跳转到一篇介绍活动的软文。

直接上代码

unit Unit7;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, xSuperObject, Vcl.StdCtrls, math;

type
  TForm7 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function get_rand(ProArr: ISuperArray): ISuperObject;
  public
    { Public declarations }
  end;

var
  Form7: TForm7;

implementation

{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);
var
  S: ISuperArray;
  jo: ISuperObject;
begin
  s := sa('[{"id":1,"prize":"Canon 5D2","v":5},{"id":2,"prize":"平板","v":15},{"id":3,"prize":"U盘","v":20},{"id":4,"prize":"电脑","v":3},{"id":5,"prize":"IPHONE","v":27},{"id":6,"prize":"not","v":30}]');
  jo := Get_rand(s);
  memo1.Lines.Add(jo.AsJSON);
end;

function TForm7.get_rand(ProArr: ISuperArray): ISuperObject;
var
  Chance: integer;
  i, randnum, j: Integer;
begin
  chance := 0;
  result := nil;
  try
    for i := 0 to ProArr.Length - 1 do
    begin
      j := ProArr.O[i].I['v'];
      Chance := Chance + j;
    end;
    for i := 0 to proarr.Length - 1 do
    begin
      RandNum := randomrange(1, Chance);
      if RandNum <= ProArr.O[i].I['v'] then
      begin
        result := ProArr.O[i];
        break;
      end
      else begin
        Chance := Chance - ProArr.O[i].I['v'];
      end;
    end;
  finally

  end;
end;


end.
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容