2009-11-26 18 views
6

tengo este problema que tengo que "auditoría" un porcentaje de mis transtactions.Calcular ciento en tiempo de ejecución

Si el porcentaje es 100 tengo para auditar a todos ellos, si es 0 Tengo que saltar a todos y si el 50% Tengo que revisar la mitad etc.

El problema (o la oportunidad) es que tengo tiene que realizar el control en tiempo de ejecución.

Lo que intenté fue:

audit = 100/percent 

Así que si por ciento es 50

audit = 100/50 (which is 2) 

Así que tienen que auditar 1 y pase de auditoría 1 1 1 .. y vaya

Si es 30

audit = 100/30 (3.3)

Auditoro 2 y omito el tercero.

Pregunta

estoy teniendo problemas con los números más allá del 50% (75%) como porque me da 1.333, ...

¿Cuándo sería el algoritmo correcto para saber cuántos ? auditoría a medida que avanzan ... también tengo problemas con 0 (debido a la división por 0: P) pero me he fijado que ya, y con 100 etc.

Cualquier sugerencia es muy apreciada.

+1

En primer lugar, en su ejemplo "auditoría de 30%", el resultado final será la auditoría de 33% hacer todas las transacciones que la auditoría tiene que ser espaciados uniformemente? o todas las transacciones provienen del encabezado de la lista (por ejemplo, si tiene que auditar el 30%, ¿puede auditar el primer 30% de las transacciones? – inspectorG4dget

+0

number_of_items = (percent) * (total_number_of_items) donde el porcentaje es [0,1] (por lo tanto, si tiene [0,100], divida entre 100). – Thanatos

+0

En general, las auditorías deben ser aleatorias. Su algoritmo no es aleatorio y puede eludirse fácilmente. Si está utilizando esto en una situación financiera, debería ajuste su algoritmo. – jabbie

Respuesta

17

¿Por qué no lo hacen al azar. Para cada transacción, elija un número aleatorio entre 0 y 100. Si ese número es menor que su "porcentaje", luego audite la transacción. Si el número es mayor que su "porcentaje", entonces no. No sé si esto satisface sus requisitos, pero durante un período prolongado de tiempo, tendrá el porcentaje correcto auditado.

Si necesita un tipo de algoritmo exacto "omisión 2, audite uno, omita 2 auditoría uno", es probable que tenga suerte adaptando line-drawing algorithm.

+0

+1. Me ganó por 5 segundos – RickNZ

+0

suena bastante razonable ... Haré una prueba rápida ..... – Sony

+2

+1, esto es lo que debe hacer por una serie de razones. Simplemente no le diga al PHB que el proceso de auditoría requerido por ley se deja al azar ... puede que no le guste eso. –

3

Prueba esto:

1) Mantenga su porcentaje de auditoría como un decimal.
2) Para cada transacción, asociar un número aleatorio (entre 0 y 1) con ella
3) Si el número aleatorio es menor que el porcentaje, la auditoría la transacción.

1

Si necesita auditar estas transacciones en tiempo real (como se reciben) quizás podría usar un generador de números aleatorios para comprobar si es necesario auditar la transacción.

Entonces, por ejemplo, si desea auditar el 50% de las transacciones, por cada transacción recibida generaría un número aleatorio entre 0 y 1, y si el número era mayor que 0.5, audite esa transacción.

Mientras que para un número bajo esto no funcionaría, por un gran número de transacciones que esto daría muy cerca del porcentaje requerido.

Esto es mejor que su sugerencia inicial, porque si no se permite un método para "jugar" el proceso de auditoría, si está auditando cada segunda transacción, esto permite que se pasen las malas transacciones.

Otra posibilidad es mantener un total acumulado de las transacciones totales y, como esto cambia el número total de transacciones que deben auditarse (de acuerdo con su porcentaje), puede canalizar las transacciones en el proceso de auditoría. Sin embargo, esto todavía abre la pequeña posibilidad de que alguien detecte el patrón y evite la auditoría.

1

Para un sistema de alto rendimiento, el método aleatorio es el mejor, pero si no desea la aleatoriedad, este algoritmo hará el trabajo. ¡No olvide probarlo en una prueba unitaria!

// 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 
0

Puede constantemente "consultar" cada auditoría usando el contador. Por ejemplo

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

Puede utilizar flotadores (sin embargo, esto traerá un poco de imprevisibilidad) o multiplicar 100 por ciento en algo para obtener una mejor resolución.

Realmente no hay necesidad de usar un generador de números aleatorios.

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

Para seguir su propio algoritmo: simplemente siga agregando que 1.333333 (u otro cociente) a un contador.

Tiene dos contadores: uno entero y uno real. Si la parte truncada de la verdadera contador = el contador de números enteros, la auditoría se lleva a cabo, de lo contrario no lo es, de esta manera:

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 

Incremento Sólo el contador real cuando su versión truncada = el contador de números enteros. Siempre incremente el contador entero.

En código:

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; 
0

No se ha probado, pero en el módulo random hay una función sample. Si transactions era una lista de transacciones, que haría algo como:

import random 

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

Esto generaría una lista to_be_audited lo que sería una muestra aleatoria, no duplicación de las transacciones.

Ver documentation on random

Cuestiones relacionadas