结合网上的算法,记录下来备用。
暂定抽奖分为三个奖项,每一个奖项的概率、数量可以控制。当一个奖项的数量为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.