运行时计算百分比
我遇到了一个问题,我需要对我的交易进行“审计”,也就是检查一部分。
如果这个比例是100%,那我就得审计所有的交易;如果是0%,那我就完全不审计;如果是50%,那我就审计一半,依此类推。
问题(或者说机会)在于,我必须在程序运行时进行这个检查。
我尝试的方法是:
audit = 100/percent
所以如果比例是50%
audit = 100 / 50 ( which is 2 )
我就审计一个,然后跳过一个,审计一个,再跳过一个……
如果比例是30%
我用100除以30,得到3.3。
我审计两个,然后跳过第三个。
问题
我在处理超过50%的数字(比如75%)时遇到了麻烦,因为它给我的结果是1.333……
我该用什么样的算法来确定我应该审计多少呢?我也遇到了0的问题(因为除以0 :P),不过我已经解决了这个问题,还有100%的情况等等。
任何建议都非常感谢。
8 个回答
3
试试这个方法:
1) 把你的审核比例保持为小数形式。
2) 对每一笔交易,给它关联一个随机数(这个随机数在0到1之间)。
3) 如果这个随机数小于你的审核比例,就对这笔交易进行审核。
3
要按照你自己的算法进行操作:只需不断地将1.333333(或其他的商)加到一个计数器上。
准备两个计数器:一个是整数计数器,一个是实数计数器。如果实数计数器去掉小数部分后等于整数计数器,就进行审计;否则就不进行,像这样:
Integer counter Real counter
1 1.333333: audit transaction
2 2.666666: audit transaction
3 3.999999: audit transaction
4 truncated(5.333333) = 5 > 4 => do NOT audit transaction
5 5.333333: audit transaction
只有当实数计数器去掉小数部分后等于整数计数器时,才增加实数计数器。整数计数器总是增加。
在代码中:
var p, pc: double;
c: integer;
begin
p := 100 / Percentage;
pc := p;
for c := 1 to NrOfTransactions do begin
if trunc(pc) = c then begin
pc := pc + p;
Do audit on transaction c
end
end;
end;
17
为什么不随机选择呢?对于每一笔交易,随机选一个0到100之间的数字。如果这个数字小于你的“百分比”,那就审核这笔交易。如果这个数字大于你的“百分比”,那就不审核。我不知道这样是否符合你的要求,但从长远来看,你审核的比例会是正确的。
如果你需要一个精确的“跳过2个,审核1个,跳过2个,审核1个”这样的算法,你可能可以尝试调整一下画线算法。