在运行时计算百分比

时间:2009-11-26 23:40:59

标签: c# java python algorithm language-agnostic

我有这个问题,我必须“审核”我的一部分转换。

如果百分比为100,我必须全部审核,如果是0,我必须全部跳过它们,如果是50%,我必须检查一半等。

问题(或机会)是我必须在运行时执行检查。

我尝试的是:

audit = 100/percent 

所以如果%是50

audit = 100 / 50 ( which is 2 ) 

所以我必须审核1并跳过1审核1并跳过1 ..

如果是30

audit = 100/30(3.3)

我审核2并跳过第三个。

问题

我遇到的问题超过了50%(比如75%)因为它给了我1.333,...

什么时候才能知道要审核的数量是正确的算法?...我也有0的问题(由于除以0:P)但我已经修复了这个问题,并且已经修复了100个等等。 / p>

非常感谢任何建议。

8 个答案:

答案 0 :(得分:17)

为什么不随便做。对于每个事务,选择0到100之间的随机数。如果该数字小于“百分比”,则审核事务。如果数字大于“百分比”,则不要。我不知道这是否满足您的要求,但在很长一段时间内,您将获得正确的百分比审核。

如果你需要一个精确的“跳过2,审核一个,跳过2个审核一个”类型的算法,你可能会有运气适应line-drawing algorithm

答案 1 :(得分:3)

试试这个:

1)将您的审核百分比保持为小数 2)对于每个交易,将随机数(0到1之间)与其关联 3)如果随机数小于百分比,则审核交易。

答案 2 :(得分:2)

    if percent > random.randint(1,100):
        print("audit")
    else:
        print("skip")

答案 3 :(得分:2)

要遵循自己的算法:只需将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;

答案 4 :(得分:1)

如果您需要实时审核这些交易(收到这些交易),您可以使用随机数生成器来检查您是否需要审核交易。

因此,如果您要审核50%的交易,则对于收到的每笔交易,您将生成0到1之间的随机数,如果该数字大于0.5,则审核该交易。

虽然对于较低的数字,这不起作用,对于大量的交易,这将使您非常接近所需的百分比。

这比你的初步建议更好,因为如果不允许方法“游戏”审计过程 - 如果你正在审计每一秒的交易,那么这会导致不良交易漏掉。

另一种可能性是保持总交易的总计,并且由于这会改变需要审计的交易总数(根据您的百分比),您可以将交易管道输入审计流程。然而,这仍然有可能让某人检测到模式并绕过审计。

答案 5 :(得分:1)

对于高吞吐量系统,随机方法是最好的,但如果您不想要随机性,则此算法将完成这项工作。不要忘记在单元测试中测试它!

// setup
int transactionCount = 0;
int auditCount = 0;
double targetAuditRatio = auditPercent/100.0;

// start of processing
transactionCount++;
double actualAuditRatio = auditCount/transactionCount;

if (actualAuditRatio < targetAuditRatio) {
    auditCount++;
    // do audit
}
// do processing

答案 6 :(得分:0)

您可以使用计数器不断“查询”每次审核。例如

ctr = 0;
percent = 50
while(1) {
   ctr += percent;
   if (ctr >= 100) {
      audit;
      ctr = ctr - 100;
   } else
      skip
}

您可以使用浮点数(但这会带来一些不可预测性)或乘以100%以获得更好的分辨率。

确实没有必要使用随机数生成器。

答案 7 :(得分:0)

未经过测试,但在random模块中有一个函数sample。如果transactions是一个交易列表,您可以执行以下操作:

import random

to_be_audited = random.sample(transactions,len(transactions*100/percentage))

这将生成一个列表to_be_audited,它将是一个随机的,非重复的事务样本。

请参阅documentation on random