运行时计算百分比

6 投票
8 回答
1483 浏览
提问于 2025-04-15 16:26

我遇到了一个问题,我需要对我的交易进行“审计”,也就是检查一部分。

如果这个比例是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个”这样的算法,你可能可以尝试调整一下画线算法

撰写回答