¿Cuál sería el mejor algoritmo para generar números aleatorios únicos para cupones de recarga?

Su caso de uso claramente requiere el uso de GUID (identificador único global).

Los GUID típicos se ven así: {3F2504E0-4F89-11D3-9A0C-0305E82C3301}

Sin embargo, lo que las empresas hacen en la práctica es usar un código numérico de 6 dígitos / 8 dígitos / 16 dígitos.

Estas son las propiedades que puede desear que tenga su cupón:

Único
No se genera ningún cupón dos veces, de modo que una vez que se utiliza el cupón, caduca y no se puede volver a usar (para evitar la manipulación por el mismo usuario). Además, para evitar inconvenientes a un futuro cliente al que se le pueda asignar el mismo código.

Fácil de leer / escribir
Por lo general, la mayoría de las empresas usan código numérico (si es largo) para evitar errores al escribir el código o incluso leerlo.

Fácil de generar
Esto es lo más importante para ti. Las estrategias que se usan con frecuencia son algunos prefijos, seguidos de Timestamp (en formato numérico – 131216 – 16 de diciembre de 2013) y finalmente por algún número aleatorio (últimos 4-6 dígitos – precaución, esto puede causar colisiones).

Entonces, una estrategia que he usado (con gran éxito y menos colisiones):
Código de cupón de 18 dígitos:

Prefijo – TX o similar (2 caracteres)
Marca de tiempo – YYMMDDHHMMSS (12 caracteres)
Número aleatorio: 1001 y 9999 (4 caracteres)

Ejemplo: TX1312161301239999 (TX | 131216130123 | 9999)

Por lo tanto, las colisiones ahora se limitan solo a los cupones generados en el mismo segundo.
Incluso esto puede evitarse creando un grupo de números predefinidos entre 1001 y 9999 (ordenados / barajados aleatoriamente) y regenerados cada pocos segundos para evitar colisiones.
Los últimos 4 dígitos pueden asignarse en serie con la garantía de evitar colisiones.

La respuesta de Srinivas es genial y deberías tener éxito usando eso

Una vez tuve que enfrentar una situación similar y estábamos seguros de que no estaríamos generando más de un código de cupón por milisegundo, por lo que utilizamos la siguiente estrategia
1. Obtenga la marca de tiempo de Unix de la generación de cupones instantánea en milisegundos
2. representa este número en la base 36. (a-z0-9)

En el momento de escribir esto, la marca de tiempo actual en milisegundos era de solo 8 caracteres en base36

HW6KNMQA

en 10 caracteres puede representar marcas de tiempo en ms más allá del año 5000

Los códigos generados de esta manera son únicos y fáciles de generar.

Solo los problemas con este enfoque serían asegurarse de que no se generen 2 códigos de cupón dentro del mismo ms.

Puede abordar esto utilizando un prefijo adicional o bajando a 1/10 de ms, según sus requisitos.

Como se mencionó, la única forma de estar 100% seguro de que sus códigos son únicos es colocarlos en una base de datos a medida que los genera. Necesitará la base de datos de todos modos para rastrear qué códigos son válidos y cuáles se han utilizado. Puede usar un ‘índice único’ en su base de datos para asegurarse de no terminar con duplicados.

Me enfrenté a un problema similar a este y se me ocurrió un sistema que llamé CouponCode. En mi caso, los códigos tenían que pasarse al usuario final en forma impresa (una carta por correo o una tarjeta preimpresa). El sistema CouponCode ayuda al generar códigos no ambiguos y también al proporcionar un complemento jQuery que brinda al usuario comentarios inmediatos a medida que escriben el código. Puede probarlo buscando Algorithm :: CouponCode en CPAN o también hay un puerto JavaScript para NodeJS en NPM.

More Interesting

¿Es posible usar Dijkstra por dos costos?

¿Cómo demostró Alan Turing que solo seis operaciones primitivas se pueden usar para realizar cualquier operación matemática?

¿Dónde se puede encontrar una foto y detalles biográficos de Burton Howard Bloom, inventor del filtro Bloom?

¿Hay algún buen algoritmo para clasificar los tonos de chino mandarín de un archivo de audio sin la necesidad de usar una red neuronal?

Dados los pares 'n1' de corchetes "[]", los pares 'n2' de corchetes "{}" y los pares 'n3' de corchetes "()", ¿cómo podemos encontrar todas las combinaciones válidas posibles de todos estos pares de manera eficiente?

¿Cuál es el enfoque para resolver la interpretación de datos en CAT? ¿Se usa lápiz y papel para dibujar estructuras o se mantiene al mínimo?

¿Cómo funciona el algoritmo de Warnsdorff?

¿Es más difícil probar la corrección de algoritmos codiciosos que probar la corrección de cualquier otra clase de algoritmos?

¿Cuál es la mejor manera de aprender estructuras de datos y cuáles son los libros para comprender esto fácilmente?

¿Qué es la inserción táctica?

¿Cómo obtenemos ideas para resolver preguntas de programación dinámica?

¿Resolver problemas en Topcoder / Codeforces es una buena manera de aprender Java Collections Framework?

¿Cuáles son las consideraciones más importantes para convertir un algoritmo en codificación?

Cómo recorrer un trabajo de búsqueda binaria e imprimirlo en orden

¿Por qué las computadoras se crean de tal manera que entiendan 0s y 1s?