function ShouldGet(Start, Range, Count, TestNum:Integer):Boolean;
var
n,m1,m2:Integer;
begin
Result:=false;
n:=TestNum-Start+1;
if n>Range then
begin
Result:=false;
exit;
end;
m:=n*Count mod Range;
Result:=(m=0);
if Result then
exit;
m2:=(n+1)*Count mod Range;
Result:=(m>m2) and (m2<>0);
//m2比m更加接近0,但不能等于0
end;
上面给出的函数并不适用于负数的情况,现进行修正:
function ShouldGet(Start, Range, Count, TestNum:LongWord):Boolean;
var
n,m,m2:LongWord;
begin
Result:=(TestNum>=Start) and (Range>0);
if not Result then
exit;
//若测试值小于开始值,或者Range为0,则退出,返回假
n:=TestNum-Start+1;
//规范化,将 TestNum 在 Start..(Start+Range-1) 内 变换为 n 在 1..Range 内
if n>Range then
begin
Result:=false;
exit;
end;
m:=n*Count mod Range;
Result:=(m=0);
//刚好对位的情况:例如: 30*1000 mod 10000 = 0
if Result then
exit;
m2:=(n+1)*Count mod Range;
//获取n之后的数字距离Range整数倍的距离
Result:=(m>m2) and (m2<>0);
//m2比m更加接近0,但不能等于0
end;