2009-08-20 15 views
12

Generar una cadena verdaderamente aleatoria de una longitud dada es una tarea bastante sencilla (y ya bien cubierta).¿Cómo puedo generar cadenas pseudoaleatorias "legibles" en Java?

Sin embargo; Me gustaría generar una secuencia aleatoria "pseudo" con la restricción adicional de que sea relativamente fácil de leer (para un lector nativo de inglés)

Creo que otra forma de decir esto es decir que la cadena generada debería consisten en "sílabas reconocibles". Por ejemplo, "akdjfwv" es una cadena aleatoria, pero no es reconocible en absoluto. "flamyom"; sin embargo, es muy "reconocible" (aunque no tiene sentido)

Obviamente, se podría hacer una larga lista de "sílabas reconocibles" y luego seleccionarlas al azar.

Pero, ¿hay una forma mejor de hacer algo como generar programáticamente una "sílaba reconocible", o generar una "sílaba" y luego probarla para ver si es "reconocible"?

Puedo pensar en varias formas de llevar a cabo esta implementación, pero si alguien ya lo ha implementado (preferiblemente en Java o C#), preferiría volver a utilizar su trabajo.

¿Alguna idea?

Respuesta

6

creo que esto debería hacer lo que quiera:

Java Password Generator

que tener el código fuente y una licencia permisiva para que pueda adaptar el código fuente a lo que busca.

+0

Esto genera excelentes cuerdas. Tiene un costo de rendimiento bastante alto (en lugar de generar longitudes secuenciales). – Jared

17

Puede intentar implementar un Markov chain y darle un pasaje adecuado para procesar. Hay un Java implementation que puede funcionar para usted.

Esta es una muestra de interpolación entre Genesis en Inglés y Genesis en español (N = 1):

En bersaran thelely y avin inder THT teathe m Lovig weay WAW DTO mofin él t thte h fupiteg sot llissed od ma. lllar t land fingujod doncella af de wand tetodamoiz fosu Andesp. ersunen thenas lowhejod whipanirede tifinas Gofuavithila d gió Y Diche fua Dios co l, liens ly Y crerdíquen ticuesereregos hielase agúnd veumarbas iarasens laragún co eruerá laciéluelamagúneren Dien a He.

+0

Me gustaría mencionar +5 Las cadenas de Markov, pero solo puedo +1 ...;) –

+0

@Alex, gracias. puedes ir a votar por otra respuesta mía que te guste (si es que hay alguna) si te sientes tan generoso –

+2

Eso estaría volando por la intención del sistema de puntos –

5

Necesita generar sílabas aleatorias. La forma más simple de hacerlo es usar sílabas que son consonante-vocal, o consonante-vocal-consonante. De una lista de consonantes y vocales, elige al azar para construir sílabas, luego une las sílabas para formar una cuerda.

Tenga en cuenta que su lista de consonantes no debe ser letras que son consonantes, sino fonemas, por lo que "th", "st", "sl", etc. podrían ser entradas en la lista de consonantes.

1

Deberías echar un vistazo a SCIgen. Genera artículos científicos completos sin sentido: http://pdos.csail.mit.edu/scigen/

Y la fuente está disponible: se lanzó bajo GPL, y actualmente está disponible a través de CVS anónimo.

1

No estoy seguro exactamente de lo que necesita esto, pero si la gente gráfica de la industria de la impresión ha usado generadores Lorem Ipsum para crear texto que se parece al texto, su cerebro lo procesa sin ser realmente legible palabras. Más información here

No sé si hay un servicio web al que pueda suscribirse, pero hay varios sitios que generarán cadenas de Lorem Ipsum para usted, por lo que puede usarlos.

1

Hay una buena sección sobre esto en Programming Pearls. Está en línea, pero recomiendo comprar el libro; Uno de los mejores libros de programación en mi opinión.

0

Todo vuelve a por qué quieres esto. Si solo quieres un "galimatías pronunciable", creo que lo más fácil sería generar consonantes y vocales alternas. Eso sería un pequeño subconjunto de todo galimatías pronunciable, pero ¿cuál es el objetivo? Para dar un rango un poco más amplio, podría crear una tabla de fonemas consonánticos y fonemas vocálicos, con la lista de consonantes que incluye no solo letras individuales como "b" y "d" sino también "th", "br", y así sucesivamente, y la lista de vocales podría incluir "oo" y "ea", etc. Un paso más sería generar sílabas en lugar de letras, con una sílaba que contenga vocal, consonante-vocal o consonante-vocal-consonante. Es decir, crear las sílabas, luego dentro de las sílabas elegir uno de los tres patrones. Probablemente quieras prohibir dos sílabas con vocales en una fila. (Estoy tratando de pensar en un ejemplo de eso en inglés. Probablemente suceda, pero los únicos ejemplos que puedo pensar están tomados de otros idiomas, como "stoa").

Cuestiones relacionadas