Numero Aleatorio e Irrepetible

09/09/2008 - 17:44 por Lazarte Federico | Informe spam
Estimados.
Necesito crear un numero aleatorio de 7 digitos y que este sea
irrepetible.
Este numero va a ser generado por unos 20 puestos de toma de datos,
cada uno generara su numero y tengo que tratar que no se repitan.
Alguien tiene algun ejemplo?.
Gracias,.

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
09/09/2008 - 18:17 | Informe spam
"Lazarte Federico" wrote in message
news:
Necesito crear un numero aleatorio de 7 digitos y que este sea
irrepetible.
Este numero va a ser generado por unos 20 puestos de toma de datos,
cada uno generara su numero y tengo que tratar que no se repitan.
Alguien tiene algun ejemplo?.



Si te valiera un número más grande, podrías usar la clase Guid para
generarlos. Pero con solo 7 dígitos, no tendrás más remedio que asignar a
cada uno de los puestos un rango de números a su disposición, y que genere
números dentro de dicho rango. Es la única forma de que no repita los
números de otros puestos, a no ser que los puestos están interconectados y
puedas ir almacenando los números ya generados en un repositorio central. En
ese caso no tienes más que generar números al azar, comprobar que no han
sido ya utilizados (y repetir en caso afirmativo).
Respuesta Responder a este mensaje
#2 Alfredo Novoa
10/09/2008 - 11:47 | Informe spam
Hola Alberto,

El Tue, 9 Sep 2008 18:17:34 +0200, Alberto Poblacion escribió:

a no ser que los puestos están interconectados y
puedas ir almacenando los números ya generados en un repositorio central. En
ese caso no tienes más que generar números al azar, comprobar que no han
sido ya utilizados (y repetir en caso afirmativo).



También se pueden almacenar los números no generados y así nunca habrá que
repetir la generación de números. Los números no generados (o los
generados) también se podrían almacenar en un repositorio distribuido.

Si los puestos no están conectados se pueden generar todos los números de 7
dígitos y repartirlos (aleatoriamente por ejemplo) entre tantos grupos como
puestos y almacenar un grupo en cada puesto. Así podríamos evitar usar
rangos.


Saludos
Alfredo
Respuesta Responder a este mensaje
#3 RFOG
10/09/2008 - 12:10 | Informe spam
Alfredo, la idea no es mala... pero almacenar diez millones de números...
Aparte de que yo al menos veo un potencial problema de seguridad: ya sabes
qué números van a salir.

La forma más "formal" desde mi punto de vista sería la siguiente: Obtener
una clave SHA de un GUID generado aleatoriamente en cada equipo y
potencialmente comparar dicha clave SHA entre los equipos para evitar una
improbable duplicidad. O mejor todavía: generar dicha clave SHA a partir
del número de serie físico del disco duro más la clave de activación del
windows o la MAC de la tarjeta de red. Luego, cada equipo generaría un
número aleatorio sin más que iría concatenado al código SHA.

De este modo, aunque dos terminales generaran el mismo número aleatorio
(cosa que no es nada difícil), al ir concatenado a la clave SHA (que si se
toma como he dicho debería ser completamente única), dicho número sería
completamente único aunque algunas cifras serían iguales.

La ventaja de esto es que incluso no es necesario ni almacenar dicha clave
SHA, ya que se podría generar automáticamente cada vez que fuera
necesaria... Otra cosa es lo fácil que es desensamblar un ejecutable .NET
para encontrar el código generatriz, lo que se podría medio resolver con
un ensamblado mixto en C++/CLI y código nativo que tuviera la parte
generatriz en C++ clásico. Así subimos las apuestas contra la
decodificación, y al ni siquiera almacenar la clave SHA tendríamos un
sistema casi todo lo seguro que fuera necesario...

On Wed, 10 Sep 2008 11:47:06 +0200, Alfredo Novoa
wrote:


Hola Alberto,

El Tue, 9 Sep 2008 18:17:34 +0200, Alberto Poblacion escribió:

a no ser que los puestos están interconectados y
puedas ir almacenando los números ya generados en un repositorio
central. En
ese caso no tienes más que generar números al azar, comprobar que no han
sido ya utilizados (y repetir en caso afirmativo).



También se pueden almacenar los números no generados y así nunca habrá
que
repetir la generación de números. Los números no generados (o los
generados) también se podrían almacenar en un repositorio distribuido.

Si los puestos no están conectados se pueden generar todos los números
de 7
dígitos y repartirlos (aleatoriamente por ejemplo) entre tantos grupos
como
puestos y almacenar un grupo en cada puesto. Así podríamos evitar usar
rangos.


Saludos
Alfredo





Microsoft Visual C++ MVP
==Mi blog sobre programación: http://geeks.ms/blogs/rfog
Momentos Leves: http://momentosleves.blogspot.com/
Cosas mías: http://rfog.blogsome.com/
Libros, ciencia ficción y programación
Hay una circulación comun, una respiración comun. Todas las cosas están
relacionadas.
Respuesta Responder a este mensaje
#4 Alfredo Novoa
10/09/2008 - 12:58 | Informe spam
Hola RFOG,

El Wed, 10 Sep 2008 12:10:46 +0200, RFOG escribió:

Alfredo, la idea no es mala... pero almacenar diez millones de números...



Sale a 1,43 megas por puesto. Cabría en un viejo disquete. A mi no me
parece tanto :-?

Aparte de que yo al menos veo un potencial problema de seguridad: ya sabes
qué números van a salir.



No, no lo sabes. El método que se usa en estos casos es elegir
aleatoriamente una posición de la lista y el número que está en esa
posición es el que sale. A continuación se coge el último número de la
lista y se mete en esa posición y se borra el último elemento de la lista.
Esto me lo enseñó mi padre cuando tenía 12 años :-)

De este modo, aunque dos terminales generaran el mismo número aleatorio
(cosa que no es nada difícil), al ir concatenado a la clave SHA (que si se
toma como he dicho debería ser completamente única), dicho número sería
completamente único aunque algunas cifras serían iguales.



Pero entonces ya no tienes un identificador de 7 dígitos.



Saludos
Alfredo
Respuesta Responder a este mensaje
#5 Alfredo Novoa
10/09/2008 - 14:03 | Informe spam
Hola RFOG

El Wed, 10 Sep 2008 12:58:19 +0200, Alfredo Novoa escribió:

De este modo, aunque dos terminales generaran el mismo número aleatorio
(cosa que no es nada difícil), al ir concatenado a la clave SHA (que si se
toma como he dicho debería ser completamente única), dicho número sería
completamente único aunque algunas cifras serían iguales.



Pero entonces ya no tienes un identificador de 7 dígitos.



Por si alguien no lo ve claro, las claves SHA-0 y SHA-1 tienen 49 dígitos
decimales, y si aun encima les concatenamos cosas, pues nos pasamos
bastante de los 7 :-)

Saludos
Alfredo
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida