web-dev-qa-db-ja.com

Javaでランダムな文字列を生成する方法

Studentというオブジェクトがあり、studentNamestudentIdstudentAddressなどのオブジェクトがあります。studentIdについては、 7つの数値文字。

studentId = getRandomId();
studentId = "1234567" <-- from the random generator.

そして、IDが重複していないことを確認する必要があります。

68
chandra wibowo

ランダムな文字列の生成は簡単です-Java.util.Randomと、使用可能にするすべての文字を含む文字列を使用するだけです。

public static String generateString(Random rng, String characters, int length)
{
    char[] text = new char[length];
    for (int i = 0; i < length; i++)
    {
        text[i] = characters.charAt(rng.nextInt(characters.length()));
    }
    return new String(text);
}

ここで、一意性のために、生成された文字列をどこかに保存する必要があります。それをどのように行うかは、アプリケーションの他の部分に依存します。

129
Jon Skeet

これはすごく素敵:

http://commons.Apache.org/proper/commons-lang/apidocs/org/Apache/commons/lang3/RandomStringUtils.html

(高い確率で)一意性が必要な場合は、MD5またはSHAハッシュの使用を検討してください。

52
David Soroko

Java.utilパッケージのUUIDクラスを使用することもできます。このパッケージは、32ビット文字列のランダムなuuidを返します。

Java.util.UUID.randomUUID().toString()

http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/UUID.html

17
Parth
Random ran = new Random();
int top = 3;
char data = ' ';
String dat = "";

for (int i=0; i<=top; i++) {
  data = (char)(ran.nextInt(25)+97);
  dat = data + dat;
}

System.out.println(dat);
5
karthik.j

次のクラスコードが役立つと思います。マルチスレッドをサポートしていますが、同期ブロックの削除やgetRandomId()メソッドへの同期など、いくつかの改善を行うことができます。

public class RandomNumberGenerator {

private static final Set<String> generatedNumbers = new HashSet<String>();

public RandomNumberGenerator() {
}

public static void main(String[] args) {
    final int maxLength = 7;
    final int maxTry = 10;

    for (int i = 0; i < 10; i++) {
        System.out.println(i + ". studentId=" + RandomNumberGenerator.getRandomId(maxLength, maxTry));
    }
}

public static String getRandomId(final int maxLength, final int maxTry) {
    final Random random = new Random(System.nanoTime());
    final int max = (int) Math.pow(10, maxLength);
    final int maxMin = (int) Math.pow(10, maxLength-1);
    int i = 0;
    boolean unique = false;
    int randomId = -1;
    while (i < maxTry) {
        randomId = random.nextInt(max - maxMin - 1) + maxMin;

        synchronized (generatedNumbers) {
            if (generatedNumbers.contains(randomId) == false) {
                unique = true;
                break;
            }
        }
        i++;
    }
    if (unique == false) {
        throw new RuntimeException("Cannot generate unique id!");
    }

    synchronized (generatedNumbers) {
        generatedNumbers.add(String.valueOf(randomId));
    }

    return String.valueOf(randomId);
}

}
2
Erol Ozcan

最初に質問する必要があるのは、IDを本当にランダムにする必要があるかどうかです。時には、シーケンシャルIDで十分な場合もあります。

さて、あなたがそれをランダムにする必要がある場合、重複を含まない生成された数列はランダムと呼ぶことはできません。 :pこれで邪魔にならないので、これを行う最速の方法は、既に生成されたすべてのIDを含むHashtableまたはHashMapを持つことです。新しいIDが生成されるたびに、ハッシュテーブルと照合し、IDが既に発生している場合は再生成します。生徒数がIDの範囲よりもはるかに少ない場合、これは一般的にうまく機能します。そうでない場合は、IDを再生成する必要が生じる確率が高くなるため、P(新しいIDの生成)= number_of_id_already_generated/number_of_all_possible_idsになります。この場合、最初の段落を確認してください(IDをランダムにする必要がありますか?)。

お役に立てれば。

1
Chris Henry

多くの可能性...

整数をランダムに生成する方法を知っていますか?したがって、そこから文字を生成することができます...(ex 65-> A)

それはあなたが必要とするもの、ランダム性のレベル、関係するセキュリティに依存します...

1