1

単語ジェネレーターを作成したいのですが、ある意味では数値システムのように思えます。Hex は から0までf、このアルゴリズムは からaまでになりzます。したがって、作成される単語は次のようになります (every-は新しい単語を意味します)。

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

たとえば、各単語はファイルに保存されるため、ファイルは次のようになります。

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

forこれは多くの入れ子になったループとsで可能だと思いますが、ifこれを行う簡単な方法はありますか? アルゴリズム全体を説明する必要はありませんが、正しい方向への微調整は大歓迎です。

4

9 に答える 9

2

単一のランダムな単語を作成する場合は、次の手順に従います。

  1. 文字の配列を設定します。char[] arr = { 'a', 'b', ... , 'z'}
  2. 文字列のサイズを示すランダムな整数を取得します。
  3. 空文字列を初期化するs
  4. 0 から描画された長さまで反復し、範囲[0,arr.length)let it beで数値を描画し、stringxに追加します。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は空の配列です。
組み合わせを小さくするlengthには、プロセス中に部分文字列も追加するか、 small で呼び出すことができますlength

組み合わせの数は単語の長さの指数関数的であるため、多くの時間がかかることに注意してください。

于 2012-08-06T10:20:08.493 に答える
1

整数を文字シーケンスにマップする関数を作成します。すなわち:

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

など。これを使用して、特定の単語または単語のリストを繰り返し作成できます。

アルゴリズム内では、モジュラスを頻繁に使用します%26…</ p>

于 2012-08-06T10:21:31.563 に答える
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 に答える
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
    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 で十分かどうかを確認するだけです (1 つの数値に文字列が必要です)。

出力

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

ナッジが提供されました:

はい、可能です。単一の for ループを実行し、すべてのカウンター値を基数 26 に変換します。その後、新しい数値のすべての数字が 1 文字をコード化します。数値を任意の基数に変換する方法については、こちらを参照してください。(広告オーバーラン ページで申し訳ありません)

于 2012-08-06T10:19:08.007 に答える
0

単語の長さを定義する必要があります。そうしないと、これは無限になります。

これは数学では組み合わせ論と呼ばれます。こちらをご覧ください。ニーズに合ったアルゴリズムを選択できます。

于 2012-08-06T10:19:53.890 に答える