在Java中如何生成伪随机的“可读”字符串?

15

生成给定长度的真正随机字符串是一个相当简单(并且已经被广泛讨论)的任务。

不过,我想生成一个“伪”随机字符串,并额外满足易于阅读(对于母语为英语的读者而言)的约束。

换句话说,我认为生成的字符串应该由“可识别的音节”组成。例如,“akdjfwv”是一个随机字符串,但完全无法识别。然而,“flamyom”非常“可识别”(尽管它是无意义的)。

显然,您可以列出一个“可识别的音节”长列表,然后随机选择它们。

但是,是否有更好的方法来像编程一样生成“可识别的音节”,或者生成“音节”并测试其是否“可识别”?

我可以想到几种实现方法,但如果有人已经实现了它(最好是在Java或C#中),我宁愿重用他们的工作。

有什么主意吗?

9个回答

18
你可以尝试实现一个马尔可夫链,并给它一个适当的段落进行处理。这里有一个Java实现,也许适合你。
引用: 这是从英文《创世纪》和西班牙文《创世纪》之间插值的示例(N = 1):在bersaran thelely和avin inder tht teathe m lovig weay waw thod mofin he t thte h fupiteg s o t llissed od ma。lllar t land fingujod maid 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。

我会给提到马尔可夫链加5分,但是我只能加1分。。。;) - Alex Feinman
@Alex,谢谢。如果你感到慷慨的话,你可以去投票支持我其他喜欢的答案。 - Rich Seller
虽然这是非常有趣的东西(而且很棒),但Java密码生成器的答案更接近我的需求。在我的问题中,我可能应该提到我真的需要它在6-12个字符、无空格的长度范围内。 - Jared
但是,不,我实际上并没有生成密码...有点类似,但是...我需要生成将用作自动化测试中日志令牌的字符串(例如- 生成将插入数据库并在以后的测试用例中反复使用的“名称”)。 - Jared
1
@Steve Kuo,我不明白这是如何“违反积分系统的意图”。我说他可以去投票支持他喜欢的我的其他答案(如果有的话)。难道不应该投票支持你认可的答案吗?建议只是让他去看看。 - Rich Seller

7
我认为这个可以满足你的需求: Java密码生成器。它有源代码和宽松的许可证,因此您可以根据自己的需要调整源代码。

这会生成很棒的字符串。但相对于生成连续的长整型,它的性能代价相当高。 - Jared
我创建了一个项目,从Java密码生成器开始,允许快速创建可发音的随机字符串。更多信息请参见PronounceableStringGenerator - jfabrizio

6
你需要生成随机音节。最简单的方法是使用辅音-元音或者辅音-元音-辅音的音节。从一个包含辅音和元音的列表中随机选择来构建音节,然后将音节连接起来形成字符串。
请注意,辅音列表中的字母不应该是辅音字母,而是音素,因此"th"、"st"、"sl"等都可以作为辅音列表中的条目。

2

你真的应该看看SCIgen。它可以生成整篇半无意义的科学论文:http://pdos.csail.mit.edu/scigen/

而且源代码是可用的:它是在GPL下发布的,目前可以通过匿名CVS获得。


1

我不确定你需要什么,但如果平面设计师在印刷行业使用Lorem Ipsum生成器创建看起来足够像文本的东西,以至于你的大脑会将其处理为文本,而实际上并不是可读的单词。更多信息请点击这里

我不知道是否有一个你可以订阅的Web服务,但有几个网站只会为你生成Lorem Ipsum字符串,所以你可能可以使用它们。


1

编程珠玑中有一个很好的章节。虽然它是在线的,但我强烈建议购买这本书;在我看来,这是最好的编程书籍之一。


1

0
我创建了一个Java包Pronounceable String Generator,可以快速生成可发音的随机字符串。
只需创建一个对象PronounceableStringGenerator并调用方法generate:
PronounceableStringGenerator mg = new PronounceableStringGenerator();
System.out.println(mg.generate(8));//8 is the length of the generated string 
System.out.println(mg.generate(10));
System.out.println(mg.generate(6));

0

一切都回到你为什么需要这个。如果你只是想要“可发音的胡言乱语”,我认为最简单的方法就是生成交替的辅音和元音。那将是所有可发音的胡言乱语中的一个小子集,但目标是什么?为了扩大范围,您可以创建一个包含辅音音素和元音音素的表格,其中辅音列表不仅包括像“b”和“d”这样的单个字母,还包括“th”、“br”等,而元音列表可以包括“oo”和“ea”等。再进一步,可以生成音节而不是字母,其中音节包含元音、辅音-元音或辅音-元音-辅音。也就是说,循环创建音节,然后在音节内选择三种模式之一。您可能希望禁止连续两个仅有元音的音节。(我正在尝试想出英语中的一个例子。它可能会发生,但我能想到的唯一例子是从其他语言借来的,比如“stoa”。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接