我有这个问题,我必须“审核”我的一部分转换。
如果百分比为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>
非常感谢任何建议。
答案 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
,它将是一个随机的,非重复的事务样本。