Рассчитать проценты во время выполнения - PullRequest
6 голосов
/ 27 ноября 2009

У меня есть проблема, когда я должен «одитировать» процент моих переводов.

Если процент равен 100, я должен проверить их все, если равен 0, я должен пропустить их все, и если 50%, я должен просмотреть половину и т. Д.

Проблема (или возможность) заключается в том, что я должен выполнить проверку во время выполнения.

То, что я пробовал, было:

audit = 100/percent 

Так что, если процент составляет 50

audit = 100 / 50 ( which is 2 ) 

Итак, я должен провести аудит 1 и пропустить 1 аудит 1 и пропустить 1 ..

Если 30

аудит = 100/30 (3,3)

Я проверяю 2 и пропускаю третий.

Вопрос

У меня проблемы с числами, превышающими 50% (например, 75%), потому что это дает мне 1.333, ...

Когда будет правильный алгоритм, чтобы узнать, сколько нужно проверять, как они идут? ... У меня также есть проблемы с 0 (из-за деления на 0: P), но я уже исправил это, и со 100 и т. Д.

Любые предложения приветствуются.

Ответы [ 8 ]

17 голосов
/ 27 ноября 2009

Почему бы не сделать это случайно. Для каждой транзакции выберите случайное число от 0 до 100. Если это число меньше вашего «процента», выполните аудит транзакции. Если число больше, чем ваш «процент», то не надо. Я не знаю, удовлетворяет ли это вашим требованиям, но в течение длительного периода времени вы будете проходить проверку правильного процента.

Если вам нужен точный алгоритм типа «пропустить 2, проверить один, пропустить 2 проверить один», вам, скорее всего, повезет, адаптируя алгоритм рисования линий .

3 голосов
/ 27 ноября 2009

Попробуйте это:

1) Сохраняйте процент аудита как десятичное число.
2) Для каждой транзакции ассоциируйте случайное число (от 0 до 1) с ним
3) Если случайное число меньше процента, проведите аудит транзакции.

2 голосов
/ 27 ноября 2009

Чтобы следовать вашему собственному алгоритму: просто продолжайте добавлять этот 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;
2 голосов
/ 27 ноября 2009
    if percent > random.randint(1,100):
        print("audit")
    else:
        print("skip")
1 голос
/ 27 ноября 2009

Для систем с высокой пропускной способностью лучше всего использовать случайный метод, но если вам не нужна случайность, этот алгоритм сделает свою работу. Не забудьте протестировать его в модульном тесте!

// 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
1 голос
/ 27 ноября 2009

Если вам необходимо проверять эти транзакции в реальном времени (по мере их поступления), возможно, вы могли бы использовать генератор случайных чисел, чтобы проверить, нужно ли вам проверять транзакцию.

Так, если, например, вы хотите провести аудит 50% транзакций, для каждой полученной транзакции вы сгенерируете случайное число в диапазоне от 0 до 1, а если число было больше 0,5, выполните аудит этой транзакции.

Хотя для небольших чисел это не сработает, для большого количества транзакций это будет очень близко к требуемому проценту.

Это лучше, чем ваше первоначальное предложение, потому что если метод не позволяет «играть» в процесс аудита - если вы проверяете каждую вторую транзакцию, это позволяет проскальзывать плохим транзакциям.

Другая возможность состоит в том, чтобы сохранять промежуточный итог всех транзакций, и, поскольку это изменяет общее количество транзакций, которые необходимо аудировать (в соответствии с вашим процентом), вы можете направлять транзакции в процесс аудита. Это, однако, все еще открывает небольшую вероятность того, что кто-то обнаружит закономерность и обойдет аудит.

0 голосов
/ 27 ноября 2009

Не тестировалось, но в модуле random есть функция sample. Если бы transactions был списком транзакций, вы бы сделали что-то вроде:

import random

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

Это создаст список to_be_audited, который будет случайной, не дублирующей выборкой транзакций.

См. документацию по случайному

0 голосов
/ 27 ноября 2009

Вы можете постоянно «запрашивать» каждый аудит, используя счетчик. Например

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

Вы можете использовать числа с плавающей точкой (однако это приведет к некоторой непредсказуемости) или умножить 100% на sth, чтобы получить лучшее разрешение.

Нет необходимости использовать генератор случайных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...