web-dev-qa-db-ja.com

Javaでランダムな文字を生成する機能はありますか?

Javaには、ランダムな文字または文字列を生成する機能がありますか?または、単純にランダムな整数を選択して、その整数のASCIIコードを文字に変換する必要がありますか?

52
Chris

これを行うには多くの方法がありますが、はい、ランダムなintを生成し(たとえば Java.util.Random.nextInt を使用)、それを使用してcharにマッピングします。特定のアルファベットがある場合、このようなものは気の利いたものです。

    import Java.util.Random;

    //...

    Random r = new Random();

    String alphabet = "123xyz";
    for (int i = 0; i < 50; i++) {
        System.out.println(alphabet.charAt(r.nextInt(alphabet.length())));
    } // prints 50 random characters from alphabet

Java.util.Randomは実際には pseudo-乱数生成器 かなり弱い 線形合同式 。あなたは暗号化の必要性に言及しました。その場合、はるかに強力な 暗号的に安全な擬似乱数ジェネレータ の使用を調査することができます(例: Java.security.SecureRandom )。

79

A-zでランダムな文字を生成するには:

Random r = new Random();
char c = (char)(r.nextInt(26) + 'a');
115
dogbane

Apache CommonsプロジェクトのRandomStringUtilsを使用することもできます。

RandomStringUtils.randomAlphabetic(stringLength);
67
Josema
private static char rndChar () {
    int rnd = (int) (Math.random() * 52); // or use Random or whatever
    char base = (rnd < 26) ? 'A' : 'a';
    return (char) (base + rnd % 26);

}

範囲a〜z、A〜Zの値を生成します。

9
Peter Walser
String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char letter = abc.charAt(rd.nextInt(abc.length()));

これも機能します。

4
Ricardo Vallejo

次の97の小さな「a」のASCII値。

public static char randomSeriesForThreeCharacter() {
Random r = new Random();
char random_3_Char = (char) (97 + r.nextInt(3));
return random_3_Char;
}

a、b、cまたはdの上記の3つの数字で、uがaからzのようなすべての文字を必要とする場合、3つの数字を25に置き換えます。

3
duggu

ドル を使用:

Iterable<Character> chars = $('a', 'z'); // 'a', 'b', c, d .. z

charsを指定すると、「シャッフル」範囲の文字を作成できます。

Iterable<Character> shuffledChars = $('a', 'z').shuffle();

その後、最初のn文字を取得すると、長さnのランダムな文字列が取得されます。最終的なコードは次のとおりです。

public String randomString(int n) {
    return $('a', 'z').shuffle().slice(n).toString();
}

NB:条件n > 0sliceによってチェッキングされます

編集

スティーブが正しく指摘したように、randomStringは各文字を1回しか使用しません。回避策として、mを呼び出す前にアルファベットをshuffle回繰り返すことができます:

public String randomStringWithRepetitions(int n) {
    return $('a', 'z').repeat(10).shuffle().slice(n).toString();
}

または、アルファベットをStringとして指定します。

public String randomStringFromAlphabet(String alphabet, int n) {
    return $(alphabet).shuffle().slice(n).toString();
}

String s = randomStringFromAlphabet("00001111", 4);
1
dfa

あなたはそれを持っています。ランダムASCIIコードを自分で生成するだけです。あなたは何のためにそれが必要ですか?

1
Strelok

Quickcheck仕様ベースのテストフレームワーク のジェネレーターを使用できます。

ランダムな文字列を作成するには、 anyString メソッドを使用します。

String x = anyString();

より制限された文字セットから、または最小/最大サイズ制限で文字列を作成できます。

通常、複数の値を使用してテストを実行します。

@Test
public void myTest() {
  for (List<Integer> any : someLists(integers())) {
    //A test executed with integer lists
  }
}
1
Thomas Jung

これを試して..

public static String generateCode() {

    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String fullalphabet = alphabet + alphabet.toLowerCase() + "123456789";
    Random random = new Random();

    char code = fullalphabet.charAt(random.nextInt(9));

    return Character.toString(code);

}
1
Sebo Molnár

これは単純ですが、有用な発見です。 RandomCharacterという名前のクラスを定義し、特定の種類の文字をランダムに取得する5つのオーバーロードメソッドを定義します。これらのメソッドは、将来のプロジェクトで使用できます。

    public class RandomCharacter {
    /** Generate a random character between ch1 and ch2 */
    public static char getRandomCharacter(char ch1, char ch2) {
        return (char) (ch1 + Math.random() * (ch2 - ch1 + 1));
    }

    /** Generate a random lowercase letter */
    public static char getRandomLowerCaseLetter() {
        return getRandomCharacter('a', 'z');
    }

    /** Generate a random uppercase letter */
    public static char getRandomUpperCaseLetter() {
        return getRandomCharacter('A', 'Z');
    }

    /** Generate a random digit character */
    public static char getRandomDigitCharacter() {
        return getRandomCharacter('0', '9');
    }

    /** Generate a random character */
    public static char getRandomCharacter() {
        return getRandomCharacter('\u0000', '\uFFFF');
    }
}

それがどのように機能するかを示すために、175個のランダムな小文字を表示する次のテストプログラムを見てみましょう。

public class TestRandomCharacter {
    /** Main method */
    public static void main(String[] args) {
        final int NUMBER_OF_CHARS = 175;
        final int CHARS_PER_LINE = 25;
        // Print random characters between 'a' and 'z', 25 chars per line
        for (int i = 0; i < NUMBER_OF_CHARS; i++) {
            char ch = RandomCharacter.getRandomLowerCaseLetter();
            if ((i + 1) % CHARS_PER_LINE == 0)
                System.out.println(ch);
            else
                System.out.print(ch);
        }
    }
}

出力は次のとおりです。

enter image description here

もう一度実行した場合:

enter image description here

私は彼の本のためにY.Daniel Liangにクレジットを与えています Introduction to Java Programming、Comprehensive Version、10th Edition 、 ここで、この知識をプロジェクトから引用して使用しました。

:オーバーロードされたメソッドに慣れていない場合、一言で言えばメソッドオーバーロードは、クラスが同じ名前を持つ複数のメソッドを持つことができる機能です、引数リストが異なる場合。

1
Gulbala Salamov

"DthJwMvsTyu"のような大文字と小文字が混在するランダム文字列を生成することを提案します。
このアルゴリズムは、そのコードa-z(97〜122)とA-Z(65〜90)が5番目のビット(2 ^)が異なる場合に、文字のASCIIコードに基づいています。 5または1 << 5または32)。

random.nextInt(2):結果は0または1です。

random.nextInt(2) << 5:結果は0または32です。

上のAは65で、下のaは97です。5番目のビット(32)のみに違いがあるため、ランダムな文字を生成するためにバイナリOR '|'を実行しますランダムcharCaseBit(0または32)およびAからZ(65から90)のランダムコード。

public String fastestRandomStringWithMixedCase(int length) {
    Random random = new Random();
    final int alphabetLength = 'Z' - 'A' + 1;
    StringBuilder result = new StringBuilder(length);
    while (result.length() < length) {
        final char charCaseBit = (char) (random.nextInt(2) << 5);
        result.append((char) (charCaseBit | ('A' + random.nextInt(alphabetLength))));
    }
    return result.toString();
}
0

Java Randomizer classをご覧ください。 randomize(char [] array)メソッドを使用して文字をランダム化できると思います。

0
manuel

polygenelubricants 'answer は、Hex値のみを生成する場合にも適したソリューションです。

/** A list of all valid hexadecimal characters. */
private static char[] HEX_VALUES = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F' };

/** Random number generator to be used to create random chars. */
private static Random RANDOM = new SecureRandom();

/**
 * Creates a number of random hexadecimal characters.
 * 
 * @param nValues the amount of characters to generate
 * 
 * @return an array containing <code>nValues</code> hex chars
 */
public static char[] createRandomHexValues(int nValues) {
    char[] ret = new char[nValues];
    for (int i = 0; i < nValues; i++) {
        ret[i] = HEX_VALUES[RANDOM.nextInt(HEX_VALUES.length)];
    }
    return ret;
}
0
schnatterer

ランダムな英数字コードを生成するコードは次のとおりです。まず、許可された文字のストリングを、乱数に含めるものとして宣言する必要があります。また、ストリングの最大長を定義する必要があります

 SecureRandom secureRandom = new SecureRandom();
 String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
    StringBuilder generatedString= new StringBuilder();
    for (int i = 0; i < MAXIMUM_LENGTH; i++) {
        int randonSequence = secureRandom .nextInt(CHARACTERS.length());
        generatedString.append(CHARACTERS.charAt(randonSequence));
    }

ToString()メソッドを使用して、StringBuilderから文字列を取得します

0
Abhishek Jha