Czy istnieje możliwość generowania losowego znaku w Javie?

Czy Java ma jakąś funkcjonalność do generowania losowych znaków lub ciągów znaków? Czy trzeba po prostu wybrać losową liczbę całkowitą i przekonwertować kod ASCII tej liczby całkowitej na znak?

 70
Author: Chris, 2010-04-13

19 answers

Można to zrobić na wiele sposobów, ale tak, polega to na wygenerowaniu losowego int (używając np. java.util.Random.nextInt) a potem używając tego do mapowania do char. Jeśli masz określony Alfabet, to coś takiego jest fajne:

    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

Należy pamiętać, że java.util.Random jest w rzeczywistości pseudo - generator liczb losowych oparty na dość słabym liniowym wzorze kongruencji . Wspomniałeś o potrzebie kryptografii; możesz chcieć zbadać użycie znacznie silniejszego kryptograficznie Bezpieczny pseudorandomowy generator liczb W takim przypadku (np. java.security.SecureRandom).

 95
Author: polygenelubricants,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 04:43:56

Aby wygenerować losowy znak w a-z:

Random r = new Random();
char c = (char)(r.nextInt(26) + 'a');
 139
Author: dogbane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 07:45:30

Możesz również użyć Randomstringuls z projektu Apache Commons:

Zależność:

<dependency> 
  <groupId>org.apache.commons</groupId> 
  <artifactId>commons-lang3</artifactId> 
  <version>3.8.1</version> 
</dependency>

Zastosowania:

RandomStringUtils.randomAlphabetic(stringLength);
RandomStringUtils.randomAlphanumeric(stringLength);
 75
Author: Josema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-06 12:25:14
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);

}

Generuje wartości w zakresach a-z, A-Z.

 14
Author: Peter Walser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 08:04:53
String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char letter = abc.charAt(rd.nextInt(abc.length()));
Ten też działa.
 9
Author: Ricardo Vallejo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-04 19:47:45

W następującej 97 wartości ascii małej "a".

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

W powyższej liczbie 3 dla a, b, c lub d i jeśli chcesz wszystkie znaki jak a do z, to zamieniasz liczbę 3 na 25.

 4
Author: duggu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-24 12:25:32

Możesz użyć generatorów z Quickcheck specification-based test framework .

Aby utworzyć losowy ciąg użyj metody anyString .

String x = anyString();

Możesz tworzyć ciągi znaków z bardziej ograniczonego zestawu znaków lub z ograniczeniami o minimalnym/maksymalnym rozmiarze.

Normalnie można uruchamiać testy z wieloma wartościami:

@Test
public void myTest() {
  for (List<Integer> any : someLists(integers())) {
    //A test executed with integer lists
  }
}
 1
Author: Thomas Jung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 07:19:11

Using dollar :

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

Biorąc pod uwagę chars można zbudować" tasowany " zakres znaków:

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

Następnie pobierając pierwsze znaki n, otrzymujemy losowy ciąg o długości n. Kod końcowy jest po prostu:

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

NB: warunek n > 0 jest spełniony przez slice

EDIT

Jak słusznie zauważył Steve, randomString używa co najwyżej jednej litery. Jako obejście możesz powtórzyć alfabet m razy przed wywołaniem shuffle:

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

Lub po prostu podaj swój alfabet jako String:

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

String s = randomStringFromAlphabet("00001111", 4);
 1
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 09:29:11

To proste, ale przydatne odkrycie. Definiuje klasę RandomCharacter z 5 przeciążonymi metodami, aby losowo uzyskać określony typ znaków. Możesz użyć tych metod w swoich przyszłych projektach.

    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');
    }
}

Aby zademonstrować jak to działa, przyjrzyjmy się poniższemu programowi testowemu wyświetlającemu 175 losowych małych liter.

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);
        }
    }
}

A Wyjście To:

Tutaj wpisz opis obrazka

Jeśli biegniesz jeszcze raz znowu:

Tutaj wpisz opis obrazka

PrzypisujęY. Danielowi Liangowi za jego książkęIntroduction to Java Programming, Comprehensive Version, 10th Edition, w której przytoczyłem tę wiedzę i wykorzystałem ją w moich projektach.

Notatka: Jeśli nie jesteś zaznajomiony z przeciążonymi methodami, w skrócie metoda Overloading jest funkcją, która pozwala klasie mieć więcej niż jedną metodę o tej samej nazwie, jeśli ich listy argumentów są różne.

 1
Author: Gulbala Salamov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-14 07:02:12

Spójrz na klasę Java Randomizer . Myślę, że można randomizować znak za pomocą metody randomize (char [] array).

 0
Author: manuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 04:00:10

Moja propozycja do generowania losowego ciągu znaków o mieszanej wielkości liter np.: "DthJwMvsTyu" .
Algorytm ten bazuje na kodach liter ASCII, gdy jego kody a-z (97 do 122) i A-Z (65 do 90) różnią się 5-tym bitem (2^5 lub 1

random.nextInt(2): wynik to 0 LUB 1.

random.nextInt(2) << 5: wynik to 0 lub 32.

Górny A to 65, a dolny a to 97. Różnica jest tylko na 5-tym bitu (32), więc do generowania random char robimy binary lub ' / ' random charCaseBit (0 lub 32) i losowy Kod od A do Z (65 do 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
Author: Marcin Programista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 11:03:30

Oto kod do wygenerowania losowego kodu alfanumerycznego. Najpierw musisz zadeklarować ciąg dozwolonych znaków, który chcesz umieścić w losowej liczbie.a także zdefiniować maksymalną długość łańcucha

 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));
    }

Użyj metody toString (), aby uzyskać String z StringBuilder

 0
Author: Abhishek Jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-07 12:53:43

Odpowiedź Polygenelubricants jest również dobrym rozwiązaniem, jeśli chcesz wygenerować tylko wartości szesnastkowe:

/** 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
Author: schnatterer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-10 11:34:03

W rzeczywistości wspomniane metody nie generują rzeczywistego losowego znaku. Aby wygenerować prawdziwy losowy znak, powinieneś dać mu losowe ziarno! w przykładowym czasie w milisekundzie. ten kod generuje 10 losowych znaków, a następnie konwertuje je na ciąg znaków:

import java.util.Random;
public class MyClass {
    public static void main() {

     String randomKey;

    char[] tempArray={0,0,0,0,0,0,0,0,0,0};  //ten characters

    long seed=System.currentTimeMillis();
    Random random=new Random(seed);
    for (int aux=0; aux<10;aux++){

        tempArray[aux]=(char) random.nextInt(255);
        System.out.println(tempArray[aux]);
    }

    randomKey=String.copyValueOf(tempArray);  


      System.out.println(randomKey);
    }
}
 0
Author: Farshid Ahmadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-26 18:18:52

Używam tego:

char uppercaseChar = (char) ((int)(Math.random()*100)%26+65);

char lowercaseChar = (char) ((int)(Math.random()*1000)%26+97);
 0
Author: Andrewsz82,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-25 14:30:47

java.util.Random jest bardziej skuteczny, jaki wypróbowałem do tej pory, mając precyzję 98.65% wyjątkowość. Podałem poniżej kilka testów, które generują 10000 partii sto 2 znaków alfanumerycznych ciągów i oblicza średnią.

Inne losowe narzędzia były RandomStringUtils z commons.lang3 i java.util.Math.

public static void main(String[] args) {
    int unitPrintMarksTotal = 0;
    for (int i = 0; i < 10000; i++) {
        unitPrintMarksTotal += generateBatchOfUniquePrintMarks(i);
    }

    System.out.println("The precision across 10000 runs with 100 item batches is: " + (float) unitPrintMarksTotal / 10000);
}

private static int generateBatchOfUniquePrintMarks(int batch) {
    Set<String> printMarks = new HashSet<>();
    for (int i = 0; i < 100; i++) {
        printMarks.add(generatePrintMarkWithJavaUtil());
    }

    System.out.println("Batch " + batch + " Unique number of elements is " + printMarks.size());

    return printMarks.size();
}

// the best so far => 98.65
// with 3 chars => 99.98
// with 4 chars => 99.9997
private static String generatePrintMarkWithJavaUtil() {
    int leftLimit = 48; // numeral '0'
    int rightLimit = 122; // letter 'z'
    int targetStringLength = 2;
    String printMark;
    do {
        printMark = new Random().ints(leftLimit, rightLimit + 1)
                .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
                .limit(targetStringLength)
                .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                .toString();
    } while (!isValid(printMark));

    return printMark;
}

// 95.46
private static String generatePrintMarkWithCommonsLang3() {
    String printMark;
    do {
        printMark = RandomStringUtils.randomAlphanumeric(2).toUpperCase();
    } while (!isValid(printMark));

    return printMark;
}

// 95.92
private static String generatePrintMarkWithMathRandom() {
    final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    StringBuilder printMark;
    do {
        printMark = new StringBuilder();
        int i = (int) (Math.random() * ALPHA_NUMERIC_STRING.length());
        printMark.append(ALPHA_NUMERIC_STRING.charAt(i));
        int j = (int) (Math.random() * ALPHA_NUMERIC_STRING.length());
        printMark.append(ALPHA_NUMERIC_STRING.charAt(j));
    } while (!isValid(printMark.toString()));

    return printMark.toString();
}

private static boolean isValid(final String printMark) {
    return true;
}
 0
Author: aurelius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-07 12:05:49

Jeśli nie masz nic przeciwko dodaniu nowej biblioteki do kodu, możesz wygenerować znaki za pomocą MockNeat (zastrzeżenie: jestem jednym z autorów).

MockNeat mock = MockNeat.threadLocal();

Character chr = mock.chars().val();
Character lowerLetter = mock.chars().lowerLetters().val();
Character upperLetter = mock.chars().upperLetters().val();
Character digit = mock.chars().digits().val();
Character hex = mock.chars().hex().val(); 
 -1
Author: Andrei Ciobanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-05 19:38:12
public static void  main(String[] args) {

  //  System.out.println("Enter a number to changeit at char  ");
    Random random = new Random();

    int x = random.nextInt(26)+65;    //0  to 25
    System.out.println((char)x);
}
 -1
Author: ArsamP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-26 10:09:09
   Random randomGenerator = new Random();

   int i = randomGenerator.nextInt(256);
   System.out.println((char)i);

Powinieneś zadbać o to, co chcesz, zakładając, że rozważasz '0,'1','2'.. jako postacie.

 -2
Author: ring bearer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 04:52:10