Ну, это зависит от вида структуры, но необходимо сделать структуру так, чтобы это тщательно и тихо обнаружило и обработало возможные конфликты.
я сомневаюсь, что можно сделать тот, который на 100% без блокировок, но снова, он зависит от того, какую структуру необходимо создать.
Вам, возможно, также понадобилась бы к черепку структура так, чтобы несколько работ потоков над отдельными объектами, и затем позже синхронизировали/повторно комбинировали.
Почему бы не сделать это случайным образом. Для каждой транзакции выберите случайное число от 0 до 100. Если это число меньше вашего «процента», выполните аудит транзакции. Если число больше вашего «процента», не делайте этого. Я не знаю, удовлетворяет ли это вашим требованиям, но в течение длительного периода времени у вас будет правильный процент аудита.
Если вам нужен точный алгоритм типа «пропустить 2, проверить один, пропустить 2, проверить один» , вам, вероятно, повезет с адаптацией алгоритма рисования линий .
if percent > random.randint(1,100):
print("audit")
else:
print("skip")
Чтобы следовать своему собственному алгоритму: просто продолжайте добавлять 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;
Для высокопроизводительной системы лучше всего использовать случайный метод, но если вам не нужна случайность, этот алгоритм выполнит свою работу. Не забудьте протестировать его в модульном тесте!
// 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) Сохраняйте процент аудита в десятичном формате.
2) Для каждой транзакции свяжите с ней случайное число (от 0 до 1)
3) Если случайное число меньше процента, проверьте транзакцию.
Другая возможность состоит в том, чтобы сохранить текущую сумму общих транзакций и, поскольку это изменяет общее количество транзакций, которые необходимо проверить (в соответствии с к вашему проценту) вы можете направлять транзакции в процесс аудита. Однако это по-прежнему оставляет небольшую вероятность того, что кто-то обнаружит закономерность и обойдет проверку.
Не тестировалось, но в модуле random
есть функция sample
. Если бы транзакции
были списком транзакций, вы бы сделали что-то вроде:
import random
to_be_audited = random.sample(transactions,len(transactions*100/percentage))
Это сгенерирует список to_be_audited
, который будет случайной, не дублирующейся выборкой транзакций.
См. Документацию по случайному
Вы можете постоянно «запрашивать» каждый аудит, используя счетчик. Например,
ctr = 0;
percent = 50
while(1) {
ctr += percent;
if (ctr >= 100) {
audit;
ctr = ctr - 100;
} else
skip
}
Вы можете использовать числа с плавающей запятой (однако это приведет к некоторой непредсказуемости) или умножить 100 процентов на sth, чтобы получить лучшее разрешение.
На самом деле нет необходимости использовать генератор случайных чисел.
Ключевое слово, которое вы ищете, это Доступность : С веб-сайта:
Первое и, возможно, самое важное правило доступности Интернета. Не все используют последнюю версию Internet Explorer, со всеми надстройками и программами, которые могут потребоваться для вашего веб-сайта. Различные технологии просмотра, каждая со своими собственными требованиями к доступности, могут включать: