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,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());
}