1

我想创建一个单词生成器,但在某种程度上它几乎看起来像一个数字系统。十六进制从0to f,这个算法应该从ato z。所以创建的词是这样的(每个都-意味着一个新词):

a - b - c - d - ... - z - aa - ab - ac - ad - ... - ba - bb - bc - ...

例如,每个单词都存储在一个文件中,因此该文件将显示为:

a  
b  
c  
d  
...  
z  
aa  
ab  
ac  
...  

我认为这可以通过很多嵌套for循环和ifs 来实现,但是有没有更简单的方法来做到这一点?您不必告诉我整个算法,但非常感谢您朝正确方向轻推。

4

9 回答 9

2

如果您正在寻找创建单个随机单词,请按照以下步骤操作:

  1. 填充字符数组:char[] arr = { 'a', 'b', ... , 'z'}
  2. 获取表示字符串大小的随机整数。
  3. 初始化一个空字符串s
  4. 从 0 迭代到绘制的长度,在[0,arr.length)let it be范围内绘制一个数字x,然后附加arr[x]到 string s

如果您正在寻找所有可能性,那么您正在寻找所有组合,我认为最简单的方法是使用递归。这个想法是“猜测”第一个字符,并在字符串的后缀上运行递归 - 对第一个字符的所有第一个可能性重复此操作,你会得到所有组合。

伪代码:

getCombinations(set,idx,length,current):
  if (idx == length):
    set.add(copy(current))
    return
  for each char c:
    current[idx] = c //setting the next char
    getCombinations(set,idx+1,length,current) //invoking recursively on smaller range

调用getCombinations([],0,length,arr)where[]是一个空集,它将保存结果,length是生成的组合的长度,并且arr是一个空数组。
要获得更小的组合,length您可以在过程中添加子字符串或使用更小的调用length

注意组合的数量在词的长度上是指数级的,所以会消耗很多时间。

于 2012-08-06T10:20:08.493 回答
1

我不知道您是否可以使用任何随机整数函数库。但是,我给你一个基于此的简单伪代码:

1) Generate a Random Number I from 1 to 10.
2) For J = 0 to I
byte array[j] =  (byte) Generate a Random Number from 0 to 128.
3) For J = 0 to I
String st = st + (char) byte array[j]

字符串将是一个随机单词。简单的。但是,不知道能不能接受。

于 2012-08-06T10:30:21.190 回答
1

创建一个将整数映射到字符序列的函数。IE:

 0  -> a
 1  -> b
 ...
 26 -> aa

等等。您可以使用它来迭代地创建特定单词或单词列表。

在您的算法中,您将%26大量使用模数……</p>

于 2012-08-06T10:21:31.563 回答
0
    final char[] tabC = "abcdefghijklmnopqrstuvwxyz".toCharArray();
    for (final char c1 : tabC) {
        System.out.println(c1 + "\t" + c1);
        for (final char c2 : tabC) {
            System.out.println(Character.toString(c1)
                + Character.toString(c2) + "\t" + (c1 + (c2 << 6)));
        }
    }

只需验证 <<6 是否足以避免冲突(必须为一个字符串使用字符串)

输出

a   97
aa  6305
ab  6369
ac  6433
. . .
ar  7393
as  7457
az  7905
b   98
ba  6306
bb  6370
bc  6434
bd  6498
. . . 


rz  7922
s   115
sa  6323
sb  6387
sc  6451
sd  6515
se  6579
于 2012-08-06T11:15:15.207 回答
0

这是一个输出前 1000 个单词的实现:

for (int n = 0; n < 1000; n++) {
   String s = Long.toString(n, 26);
   StringBuilder word = new StringBuilder();
   for (int i = 0; i < s.length(); i++) {
       int value = Character.digit(s.charAt(i), 26);
       // if it is not the right most caracter, then '1' is map to 'a', if not,
       // '0' is map to 'a'
       value = value + (i < s.length() - 1 ? -1 : 0);
       word.append(Character.toChars('a' + value)[0]);
   }
   System.out.println(n + " -> " + word.toString());
}
于 2013-06-20T05:10:20.460 回答
0

假设您知道列表的长度,并且“单词”再次具有随机长度且完全随机。然后,您可以执行以下操作(它打印单词,您可以将它们写在文件上):

import java.util.Random;
...
String alphabet = "qwertyuioplkjhgfdsazxcvbnm";
Random r = new Random();

for(int i = 0; i < list_length; i++) {
  int word_size = r.nextInt(word_max_length);
  String word = "";
  for(int j = 0; j < word_size; j++) {
    word += alphabet.charAt(r.nextInt(alphabet.length()));
  }
  System.out.println(word);
}
于 2012-08-06T10:28:05.413 回答
0

轻推服务:

对的,这是可能的。您运行单个 for 循环,然后将每个计数器值转换为以 26 为基数。然后新数字中的每个数字都将编码一个字母。请参阅此处了解如何将数字转换为任意基数。(对不起广告溢出页面)

于 2012-08-06T10:19:08.007 回答
0

你需要定义你的话有多长,否则这将是无限的。

这在数学中称为组合数学,看看这里你可以选择适合你需要的算法。

于 2012-08-06T10:19:53.890 回答
0

我会这样做:

输入 n - 要生成的单词数,[I,J] - 单词长度的范围。

算法:

  • 做n次:

    • i <- I 和 J 之间的随机数。
    • 做 i 次:(0 <= j <= i-1)
      • Word[j] = 'a' 和 'z' 之间的随机字符
    • 将 Word 添加到结果中
  • 返回结果

于 2012-08-06T11:24:30.210 回答