Generador aleatorio ponderado de nombres y apellidos

Nombres al azar

Son unas hojas de cálculo para la generación de nombres y apellidos aleatorios en base a su frecuencia de uso.

Los datos han sido obtenidos del INE (Instituto Nacional de Estadística)

Generadores

Javascript

Visual Basic .NET

OpenOffice.org Calc

Microsoft Excel

Nota: Para bajar las hojas de cálculo (vínculo verde) pulsa el botón derecho sobre el enlace y elige "Guardar enlace como"

Base de datos

Los nombres y apellidos más utilizados en España se ha extraído del Instituto Nacional de Estadística [1]

Tabla de nombres

pesoFRECUENCIANOMBRESEXO
400030.671ISIDROH
39930.87830.878CARMELOH
39861.86430.986GERARDOH
39793.42131.557GUSTAVOH
396125.02731.606IKERH
561.511.9191.377.856MANUELH
462.915.5491.403.630JUANH
364.471.0781.555.529ANTONIOH
267.419.1402.948.062JOSEH
173.854.6686.435.528MARIAM

Tabla de apellidos

pesoFRECUENCIAAPELLIDO
256170100VIVA
25616100100DE SANTANA
25615200100FAMADAS
25614300100DE TOLEDO
25613400100MALAGUILLA
538.567.933879.145LOPEZ
439.496.551928.618FERNANDEZ
340.429.475932.924RODRIGUEZ
241.364.610935.135GONZALEZ
142.848.5491.483.939GARCIA

Las tablas están ordenadas descendentemente por la frecuencia

Las columna peso han sido calculada a partir de la frecuencia. La columna peso va acumulando la frecuencia que va quedando arriba

Búsqueda ponderada

Para obtener un nombre/apellido aleatorio teniendo en cuenta su frecuencia:

  1. Generamos un número al azar entre 0 y el peso máximo de la tabla nombres/apellidos
  2. Buscamos el número en la columna peso empezando por arriba y sin pasarnos
  3. Recuperamos la columna del nombre/apellido

Esto se puede realizar con la función BUSCARV de la hoja de cálculo

Fórmulas

=BUSCARV(ALEATORIO.ENTRE(0;peso_maximo_nombre);tabla_nombres;3;1)
=BUSCARV(ALEATORIO.ENTRE(0;peso_maximo_apellido);tabla_apellidos;3;1)

Funciones VBA

En Excel podemos usar las funciones NombreAzarPonderado() y ApellidoAzarPonderado() para simplificar la fórmula que tendríamos que escribir

Function NombreAzarPonderado() As String
Const DESPLAZ = 2
Dim rangoPesos As Range
Set rangoPesos = Range("NOMBRES").Resize(,1).Offset(0, -DESPLAZ)
NombreAzarPonderado = CeldaAzarPonderado(rangoPesos).Offset(0, DESPLAZ).Value
End Function

Function ApellidoAzarPonderado() As String
Const DESPLAZ = 2
Dim rangoPesos As Range
Set rangoPesos = Range("APELLIDOS").Resize(,1).Offset(0, -DESPLAZ)
ApellidoAzarPonderado = CeldaAzarPonderado(rangoPesos).Offset(0, DESPLAZ).Value
End Function

Function CeldaAzarPonderado(rangoPesos As Range) As Range
'Los pesos están ordenados de menor a mayor
Dim maximoPeso As Long
Dim azar As Long
Dim valor As Long
Dim indice As Long
maximoPeso = rangoPesos.Cells(rangoPesos.Cells.Count).Value
azar = Int(Rnd() * maximoPeso)
valor = Application.WorksheetFunction.Lookup(azar, rangoPesos) 'BUSCAR
indice = Application.WorksheetFunction.Match(valor, rangoPesos, 0) 'COINCIDIR
Set CeldaAzarPonderado = rangoPesos.Cells(indice)
End Function

Enlaces de referencia

Comentarios

  1. 1 Lyteypa 2016-10-03 Hace un año
    Hola, uso este programa para nombrar los personajes de mis novelas pero... una pregunta.

    ¿sería posible seleccionarlo por años? Es decir, un personaje de 1950 tiene más probabilidades de llamarse ... yo qué sé, Eugenio que Brian... por ejemplo

    yo hasta ahora uso los excell del INE para buscar nombres acorde a la provincia y al año pero... ¿sería posible hacerlo aleatorio también?

    Indicar sexo, provincia y año de nacimiento (o rango de años) y que me devuelva un nombre, apellidos y posibles datos....

    Muchas gracias
Proinf.net, ©2003-2017 ci 3.1.6 (CC) Esta obra está bajo una licencia de Creative Commons Este software está sujeto a la CC-GNU GPL