Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java单词生成算法_Java_Algorithm_Word_Generator - Fatal编程技术网

Java单词生成算法

Java单词生成算法,java,algorithm,word,generator,Java,Algorithm,Word,Generator,我想创建一个单词生成器,但在某种程度上,它看起来像一个数字系统。 十六进制从0到f,此算法应该从a到z。因此,创建的单词是这样的(每个-表示一个新词): 例如,每个单词都存储在一个文件中,因此该文件将读取: a b c d ... z aa ab ac ... 我认为这是可能的,因为有很多嵌套的for循环和ifs,但是有没有更简单的方法呢?您不必告诉我整个算法,但非常感谢您朝正确方向轻推。轻推服务: 是的,这是可能的。运行单for循环,然后将每个计数器值

我想创建一个单词生成器,但在某种程度上,它看起来像一个数字系统。 十六进制从
0
f
,此算法应该从
a
z
。因此,创建的单词是这样的(每个
-
表示一个新词):

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

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

我认为这是可能的,因为有很多嵌套的
for
循环和
if
s,但是有没有更简单的方法呢?您不必告诉我整个算法,但非常感谢您朝正确方向轻推。

轻推服务:


是的,这是可能的。运行单for循环,然后将每个计数器值转换为基数26。然后,新号码中的每个数字将编码一个字母。请参阅如何将数字转换为任意基数。(很抱歉广告溢出页面)

轻推服务:


是的,这是可能的。运行单for循环,然后将每个计数器值转换为基数26。然后,新号码中的每个数字将编码一个字母。请参阅如何将数字转换为任意基数。(很抱歉,广告溢出页面)

您需要定义您的单词的长度,否则这将是无限的


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

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


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

如果你想创建一个随机单词,请按照以下步骤操作:

  • 填充字符数组:
    char[]arr={'a','b',…,'z'}
  • 获取表示字符串大小的随机整数
  • 初始化空字符串
    s
  • 从0迭代到绘图长度,在
    [0,arr.length)
    范围内绘制一个数字,让它成为
    x
    ,并将
    arr[x]
    附加到字符串
    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)调用
    ,其中
    []
    是一个空集,将保存结果,
    length
    是生成的组合的长度,
    arr
    是一个空数组。
    要获得小于
    长度
    的组合,您可以在过程中添加子字符串,也可以使用较小的
    长度
    进行调用


    请注意,组合的数量与单词的长度成指数关系,因此会耗费大量时间。

    如果您希望创建单个随机单词,请执行以下步骤:

  • 填充字符数组:
    char[]arr={'a','b',…,'z'}
  • 获取表示字符串大小的随机整数
  • 初始化空字符串
    s
  • 从0迭代到绘图长度,在
    [0,arr.length)
    范围内绘制一个数字,让它成为
    x
    ,并将
    arr[x]
    附加到字符串
    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)调用
    ,其中
    []
    是一个空集,将保存结果,
    length
    是生成的组合的长度,
    arr
    是一个空数组。
    要获得小于
    长度
    的组合,您可以在过程中添加子字符串,也可以使用较小的
    长度
    进行调用


    请注意,组合的数量与单词的长度成指数关系,因此会消耗大量时间。

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

     0  -> a
     1  -> b
     ...
     26 -> aa
    
    你可以用它来创建一个特定的单词或者一个单词列表


    在您的算法中,您将大量使用模数
    %26

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

     0  -> a
     1  -> b
     ...
     26 -> aa
    
    你可以用它来创建一个特定的单词或者一个单词列表


    在您的算法中,您将大量使用模数
    %26

    让我们假设您知道列表的长度,并且“单词”又是随机长度和完全随机的。然后您可以执行以下操作(它打印单词,您可以将其写入文件):

    import java.util.Random;
    ...
    字符串字母表=“qwertyuioplkjhgfdsazxcvnm”;
    随机r=新随机();
    对于(int i=0;i
    假设您知道列表的长度,“单词”又是随机长度和完全随机长度。然后您可以执行以下操作(打印单词,您可以将其写入文件):

    import java.util.Random;
    ...
    字符串字母表=“qwertyuioplkjhgfdsazxcvnm”;
    随机r=新随机();
    对于(int i=0;i
    我不知道你是否可以使用任何随机整数函数库。但是,我给你一个简单的伪代码
    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]
    
        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)));
            }
        }
    
    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
    
    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());
    }