1

単語を分解して、12 のランダムな文字に混ぜようとしています。

このコードが 5 回中 3 回しか機能しない理由がわかる人はいますか? うまくいかないときは、そこにあるはずの文字が 1 つか 2 つ欠けているだけです。

ありがとうございました

public static String MixWordWithLetters(String word) {
Random r = new Random();

String characters = "abcdefghijklmnopqrstuvwxyz";  
char[] text = new char[12];
for (int i = 0; i < 12; i++)
{
    text[i] = characters.charAt(r.nextInt(characters.length()));
}
String randomletters = new String(text);

char[] wrd = word.toCharArray();
char[] rl = randomletters.toCharArray();

for (int i = 0; i < wrd.length; i++) {
    int rand = (int) (Math.random() * rl.length);
    rl[rand] = wrd[i] ;
}

 String WordMixed = new String(rl);
return WordMixed; }
4

2 に答える 2

2

このループでは、

for (int i = 0; i < 12; i++) 
{
    text[i] = characters.charAt(r.nextInt(characters.length()));
}

r.nextInt(characters.length())2 つの異なる反復で同じ数値を返すとどうなるかを考えてみましょう。

Math.random() * rl.length他のループでも同様です。

配列シャッフルは、どの要素が既にシャッフルされているかを追跡する必要があります

次から始めましょう。

a b c d e f

シャッフルされた配列の最初の要素を考えてみましょう。{a, b, c, d, e, f}要素ごとに 1/6 の確率でセットからランダムに選択する必要があります。

シャッフルされた配列の 2 番目の要素は、元の配列のすべての要素から、最初の位置で選択されたものを差し引いたものからランダムに選択する必要があります{a, b, c, d, e, f} - {shuffled[0]}。今回は 1/5 の確率です。

同様に、3 番目の要素は、{a, b, c, d, e, f} - {shuffled[0], shuffled[1]}それぞれ 1/4 の確率で から取得されます。

配列を in-placeでシャッフルしている場合は、スワップによって要素を移動できます。これにより、残りの要素が自動的に追跡されます。セイeが第一候補でした。aと を交換するとどうなるか見てみましょうe:

e b c d a f
^ . . . . .

選択された要素がインデックス 0 に移動されたため、残りの要素はすべてインデックス 1 から 5 になりました。次の要素は、インデックス 1 から 5 の間から選択する必要があります。

が次に選択されたとしましょうb。したがって、それ自体と交換されます。

e b c d a f
^ ^ . . . .

いいえ、インデックス 2 から 5 に残りの要素があります。アルゴリズムは、インデックス 4 までこの方法で続行できます。この時点で、配列全体がシャッフルされます。要素の交換により、残りの要素を簡単に追跡できるため、配列をその場でシャッフルするのが簡単になります。

Collections.shuffle()JDK ソースを調べると、1 つの最適化で同じことを行うことがわかります。

于 2012-04-19T01:25:44.630 に答える
1

ご質問の意図がわかりませんが、あえて推測してみます。char 配列 text[] の長さは 12 です。入ってくる単語はそれよりも小さいと見なされますか?

wrd をループして rl に文字を入れる場合、以前に入れた文字を上書きしないという保証はありません。

于 2012-04-19T01:31:43.460 に答える