Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでランダムな文字列を生成する方法|サンプルコード付きで解説


この記事では、Javaを使ってランダムな文字列を生成する方法を解説します。文字列(String)とは、1つ以上の文字から構成され、ダブルクォート(" ")で囲まれたデータ型のことです。ランダム文字列は、パスワードの生成、テストデータの作成、一時的なIDの発行など、さまざまな場面で活用されています。

まず、今回作成するプログラムの動作イメージを確認しておきましょう。

入力(文字列の長さを指定):

文字列の長さ: 10

出力(生成される文字列):

ランダム文字列: ink1n1dodv

アルゴリズム

ステップ1 - 処理を開始する
ステップ2 - 文字列の長さを格納する整数型変数「string_size」、使用する文字セットを格納する文字列変数「alpha_numeric」、StringBuilderクラスのオブジェクト「string_builder」を宣言する
ステップ3 - 各変数に値を設定する
ステップ4 - forループで指定回数(10回)繰り返し、Math.random()で乱数を生成してインデックスを求め、append()メソッドで該当する文字を追加する
ステップ5 - 結果を表示する
ステップ6 - 処理を終了する

例1: mainメソッド内にすべての処理を記述する方法

最初の例では、すべての処理をmainメソッドの中にまとめて記述します。文字セットには、数字(0〜9)とアルファベット小文字(a〜z)を組み合わせています。

ポイントは (int)(alpha_numeric.length() * Math.random()) の部分です。Math.random()は0.0以上1.0未満のdouble値を返すため、これに文字セットの長さを掛けてint型にキャストすることで、「0」から「文字セットの長さ-1」までの範囲のランダムなインデックスが得られます。あとはcharAt()でその位置の文字を取り出し、StringBuilderに追加していきます。

public class RandomString {
    public static void main(String[] args) {
        int string_size = 10;
        System.out.println("文字列の長さ: " + string_size);
        String alpha_numeric = "0123456789" + "abcdefghijklmnopqrstuvxyz";
        StringBuilder string_builder = new StringBuilder(string_size);
        for (int i = 0; i < string_size; i++) {
            int index = (int)(alpha_numeric.length() * Math.random());
            string_builder.append(alpha_numeric.charAt(index));
        }
        String result = string_builder.toString();
        System.out.println("生成されたランダム文字列: " + result);
    }
}

実行結果

文字列の長さ: 10
生成されたランダム文字列:
ink1n1dodv

例2: 処理をメソッドに分割する方法

次の例では、ランダム文字列を生成する処理を独立したメソッドgetAlphaNumericString()に切り出しています。オブジェクト指向の設計思想にも沿っており、他のクラスからも呼び出せるため、再利用性の高いこちらの書き方が推奨されます。

public class RandomString {
    static String getAlphaNumericString(int string_size) {
        String alpha_numeric = "0123456789" + "abcdefghijklmnopqrstuvxyz";
        StringBuilder string_builder = new StringBuilder(string_size);
        for (int i = 0; i < string_size; i++) {
            int index = (int)(alpha_numeric.length() * Math.random());
            string_builder.append(alpha_numeric.charAt(index));
        }
        return string_builder.toString();
    }
    public static void main(String[] args) {
        int string_size = 10;
        System.out.println("文字列の長さ: " + string_size);
        System.out.println("生成されたランダム文字列:");
        System.out.println(RandomString.getAlphaNumericString(string_size));
    }
}

実行結果

文字列の長さ: 10
生成されたランダム文字列:
ink1n1dodv

補足: セキュリティ目的ならSecureRandomを使用する

Math.random()は簡易的な擬似乱数生成器であり、生成される値には予測可能性があります。そのため、パスワードや認証トークンなどセキュリティに関わる用途には適していません。こうしたケースでは、暗号学的に強度の高い乱数を提供するjava.security.SecureRandomクラスを使用しましょう。

import java.security.SecureRandom;

public class SecureRandomString {
    public static void main(String[] args) {
        String alpha_numeric = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        StringBuilder sb = new StringBuilder(10);
        SecureRandom random = new SecureRandom();
        for (int i = 0; i < 10; i++) {
            sb.append(alpha_numeric.charAt(random.nextInt(alpha_numeric.length())));
        }
        System.out.println("生成されたランダム文字列: " + sb.toString());
    }
}

まとめ

Javaでランダムな文字列を生成する基本の流れは、「Math.random()で乱数を発生させる → charAt()で文字を取り出す → StringBuilderに追加する」というシンプルなものです。処理をメソッドに分割すれば再利用性が高まり、セキュリティが必要な場面でもSecureRandomへの置き換えは容易です。用途に応じて適切な方法を選択してください。

  1. Javaで文字列内の母音をカウントする方法をわかりやすく解説

    Javaでは、拡張forループと条件分岐を組み合わせることで、文字列に含まれる母音(a、e、i、o、u)の数を簡単にカウントできます。この記事では、基本的な実装方法をサンプルコード付きで解説します。 カウントの仕組み まず、カウント用の変数 count を 0 で初期化します。これは、母音の数をこの変数に加算していくためです。 次に、toCharArray() メソッドを使って文字列を1文字ずつ取り出し、Character.toLowerCase() ですべて小文字に変換します。これにより、大文字・小文字を区別せずに母音を判定できるようになります。 for(char ch : myStr.t

  2. Javaで文字列を比較する方法|equals()とequalsIgnoreCase()の使い分けを徹底解説

    Javaで文字列の等価性を比較する際は、Stringクラスが提供するequalsメソッドまたはequalsIgnoreCaseメソッドを使用するのが基本です。この記事では、それぞれのメソッドの使い方に加えて、==演算子で文字列を比較してはいけない理由についても詳しく解説します。 equals()メソッドで文字列を比較する 2つの文字列を比較し、大文字と小文字の違いまで厳密に判定したい場合はequals()メソッドを使用します。 次のコード例では、2つのStringインスタンスが大文字小文字を含むすべての文字において一致しているかどうかを判定しています。 public class Compare