有没有哪位大哥大姐的代码借我看看,我总是写不好
email:[email protected]

解决方案 »

  1.   

    咋们两个可以交流一下,我也不知道该如何体现概率,我写的函数,不过觉得很差,是等概率的,My Mail:[email protected]  function GetLottery(SumSeeds,LotSeeds:integer):string;
      var
        FromBalls,ToBalls:array of integer;
        i,j,k,l,m:integer;
        s:string;
      begin
        SetLength(ToBalls,LotSeeds);
        SetLength(FromBalls,SumSeeds);
        k:=SumSeeds-1;
        for i:=1 to LotSeeds do
        begin
          j:=1+random(k);
          for l:=0 to SumSeeds-1 do
          begin
            if l>j-1 then
            begin
              ToBalls[i-1]:=j;
              FromBalls[j-1]:=i;
              Break;
            end
            else
            begin
              if FromBalls[l]<>0 then
                Inc(j);
            end;
          end;
          Dec(k);
          s:=s+Format('%2.2d',[Toballs[i-1]])+',';
        end;
        result:=s;
      end;
      

  2.   

    我新写的几个函数,很初步,并且效率不高,但是可以简单的实现等概率、排除选定组合、包含选定组合的取值,希望能够交流一下。使用函数前不要忘了Randomize呀,要不然呵呵。  //----------------------------------------------------------------------------
      //函数:function CharFrequency(const subString,s:string):integer;
      //作用:取得指定子句subString在字符串s中出现的频率
      //参数:subString:子句;s查询字符串。
      //----------------------------------------------------------------------------
      function CharFrequency(const subString,s:string):integer;
      var
        internalString:string;
        i,j,k:integer;
      begin
        internalString:=s;
        k:=0;
        j:=Length(subString);
        i:=Pos(substring,internalString);
        while i>0 do
        begin
          k:=k+1;
          Delete(internalString,i,j);
          i:=Pos(substring,internalString);
        end;
        result:=k;
      end;
      //----------------------------------------------------------------------------
      //函数:function GetLottery(SumSeeds,LotSeeds:integer):string;
      //作用:等概率取得在选定范围内[1..SumSeeds]中LotSeeds数量的一个随机数序列
      //参数:SumSeeds:取数范围,从1开始;LotSeeds:随机数序列的长度。
      //----------------------------------------------------------------------------
      function GetLottery(SumSeeds,LotSeeds:integer):string;
      var
        FromBalls,ToBalls:array of integer;
        i,j,k,l,m:integer;
        s:string;
      begin
        SetLength(ToBalls,LotSeeds);
        SetLength(FromBalls,SumSeeds);
        k:=SumSeeds;
        for i:=1 to LotSeeds do
        begin
          j:=1+random(k);
          for l:=1 to SumSeeds do
          begin
            if l>j then
            begin
              ToBalls[i-1]:=j;
              FromBalls[j-1]:=i;
              Break;
            end
            else
            begin
              if FromBalls[l-1]<>0 then
                Inc(j)
              else
              begin
                if l=j then
                begin
                  ToBalls[i-1]:=j;
                  FromBalls[j-1]:=i;
                  Break;
                end;
              end;
            end;
          end;
          Dec(k);
          s:=s+Format('%2.2d',[Toballs[i-1]])+',';
        end;
        result:=s;
      end;  //----------------------------------------------------------------------------
      //函数:function ExceptLot(SumSeeds,LotSeeds:integer;ExceptStr:array of integer):string;
      //作用:排除制定的整数序列ExceptStr,
      //      取得在选定范围内[1..SumSeeds]中LotSeeds数量的一个随机数序列
      //参数:SumSeeds:取数范围,从1开始;LotSeeds:随机数序列的长度;ExceptStr:被排除的证书序列,
      //      使用方式如[1,2,3,4]。
      //----------------------------------------------------------------------------
      function ExceptLot(SumSeeds,LotSeeds:integer;ExceptStr:array of integer):string;
      var
        FromBalls,ToBalls:array of integer;
        i,j,k,l,m:integer;
        s:string;
      begin
        if Length(ExceptStr)>=(SumSeeds-LotSeeds) then
        begin
          ShowMessage('排除范围过大');
          Result:='';
          Exit;
        end;    LotSeeds:=LotSeeds+Length(ExceptStr);//注意和包含取法的不同
        SetLength(ToBalls,LotSeeds);
        SetLength(FromBalls,SumSeeds);
        for i:=0 to Length(ExceptStr)-1 do
        begin
          ToBalls[i]:=ExceptStr[i];
          FromBalls[ToBalls[i]-1]:=i+1;
        end;    k:=SumSeeds-Length(ExceptStr);
        for i:=1+Length(ExceptStr) to LotSeeds do
        begin
          j:=1+random(k);
          for l:=1 to SumSeeds do
          begin
            if l>j then
            begin
              ToBalls[i-1]:=j;
              FromBalls[j-1]:=i;
              Break;
            end
            else
            begin
              if FromBalls[l-1]<>0 then
                Inc(j)
              else
              begin
                if l=j then
                begin
                  ToBalls[i-1]:=j;
                  FromBalls[j-1]:=i;
                  Break;
                end;
              end;
            end;
          end;
          Dec(k);
          s:=s+Format('%2.2d',[Toballs[i-1]])+',';
        end;
        result:=s;
      end;  //----------------------------------------------------------------------------
      //函数:function IncludeLot(SumSeeds,LotSeeds:integer;ExceptStr:array of integer):string;
      //作用:始终选定指定的整数序列ExceptStr,
      //      取得在选定范围内[1..SumSeeds]中LotSeeds(包含Exceptstr)数量的一个随机数序列
      //参数:SumSeeds:取数范围,从1开始;LotSeeds:随机数序列的长度;ExceptStr:始终包含的整数序列,
      //      使用方式如[1,2,3,4]。
      //----------------------------------------------------------------------------
      function IncludeLot(SumSeeds,LotSeeds:integer;ExceptStr:array of integer):string;
      var
        FromBalls,ToBalls:array of integer;
        i,j,k,l,m:integer;
        s:string;
      begin
        if Length(ExceptStr)>=LotSeeds then
        begin
          ShowMessage('包含范围过大');
          Result:='';
          Exit;
        end;    SetLength(ToBalls,LotSeeds);
        SetLength(FromBalls,SumSeeds);
        
        for i:=0 to Length(ExceptStr)-1 do
        begin
          ToBalls[i]:=ExceptStr[i];
          FromBalls[ToBalls[i]-1]:=i+1;
          s:=s+Format('%2.2d',[Toballs[i]])+',';//包含时的做法
        end;    k:=SumSeeds-Length(ExceptStr);
        for i:=1+Length(ExceptStr) to LotSeeds do
        begin
          j:=1+random(k);
          for l:=1 to SumSeeds do
          begin
            if l>j then
            begin
              ToBalls[i-1]:=j;
              FromBalls[j-1]:=i;
              Break;
            end
            else
            begin
              if FromBalls[l-1]<>0 then
                Inc(j)
              else
              begin
                if l=j then
                begin
                  ToBalls[i-1]:=j;
                  FromBalls[j-1]:=i;
                  Break;
                end;
              end;
            end;
          end;
          Dec(k);
          s:=s+Format('%2.2d',[Toballs[i-1]])+',';
        end;
        result:=s;
      end;  //----------------------------------------------------------------------------
      //函数:function CallGetInclude(SumSeeds,LotSeeds:integer;ExceptStr:string):string;
      //作用:将符合要求格式的ExceptStr:string转化为array of integer,并调用函数IncludeLot;
      //参数:解释略
      //----------------------------------------------------------------------------
      function CallGetInclude(SumSeeds,LotSeeds:integer;ExceptStr:string):string;
      var
        i,j,iRound,iLength:integer;
        iParam:array of integer;
        sParam,s:string;
      begin
        sParam:=ExceptStr;
        iRound:=CharFrequency(',',sParam);
        iLength:=Length(sParam);
        if Copy(sParam,iLength,1)<>',' then
        begin
          iRound:=iRound+1;
          iLength:=iLength+1;
          sParam:=sParam+',';
        end;
        SetLength(iParam,iRound);
        s:='';
        j:=0;
        for i:=1 to iLength do
        begin
          if sParam[i]=',' then
           begin
             iParam[j]:=StrToIntDef(s,0);
             s:='';
             inc(j);
           end
           else
           begin
             s:=s+sParam[i];
           end;
        end;
        result:=IncludeLot(SumSeeds,LotSeeds,iParam);
      end;  //----------------------------------------------------------------------------
      //函数:function CallGetExcept(SumSeeds,LotSeeds:integer;ExceptStr:string):string;
      //作用:将符合要求格式的ExceptStr:string转化为array of integer,并调用函数ExceptLot;
      //参数:解释略
      //----------------------------------------------------------------------------
      function CallGetExcept(SumSeeds,LotSeeds:integer;ExceptStr:string):string;
      var
        i,j,iRound,iLength:integer;
        iParam:array of integer;
        sParam,s:string;
      begin
        sParam:=ExceptStr;
        iRound:=CharFrequency(',',sParam);
        iLength:=Length(sParam);
        if Copy(sParam,iLength,1)<>',' then
        begin
          iRound:=iRound+1;
          iLength:=iLength+1;
          sParam:=sParam+',';
        end;
        SetLength(iParam,iRound);
        s:='';
        j:=0;
        for i:=1 to iLength do
        begin
          if sParam[i]=',' then
           begin
             iParam[j]:=StrToIntDef(s,0);
             s:='';
             inc(j);
           end
           else
           begin
             s:=s+sParam[i];
           end;
        end;
        result:=ExceptLot(SumSeeds,LotSeeds,iParam);
      end;