是否有在Java中生成随机字符的功能?

问题描述 投票:51回答:16

Java是否具有生成随机字符或字符串的任何功能?或者只需选择一个随机整数并将该整数的ascii代码转换为字符?

java random
16个回答
75
投票

有很多方法可以做到这一点,但是,是的,它涉及生成随机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-random number generatorlinear congruence formula。你提到了密码学的必要性;在这种情况下,您可能想要研究使用更强大的cryptographically secure pseudorandom number generator(例如java.security.SecureRandom)。


1
投票

这是一个简单但有用的发现。它定义了一个名为RandomCharacter的类,它有5个重载方法,可以随机获取某种类型的字符。您可以在将来的项目中使用这些方法。

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

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

为了演示它是如何工作的,让我们看看下面的测试程序,显示175个随机小写字母。

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

}

输出是:

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

如果你再跑一次:

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

我赞扬了Y.Daniel Liang的书enter image description here,我在这些书中引用了这些知识并在我的项目中使用。

注意:如果您不熟悉重载的方法,简而言之,方法重载是一种允许类具有多个具有相同名称的方法的功能,如果它们的参数列表不同。


0
投票

看看Java enter image description here课程。我认为你可以使用randomize(char [] array)方法随机化一个字符。


0
投票

我建议用混合大小写生成随机字符串,如:“DthJwMvsTyu”。 当代码Introduction to Java Programming, Comprehensive Version, 10th Edition,(97到122)和Randomizer(65到90)的第5位(2 ^ 5或1 << 5或32)时,该算法基于字母的ASCII码。

a-z:结果为0或1。

A-Z:结果为0或32。

random.nextInt(2)是65,下random.nextInt(2) << 5是97.差异只在第5位(32)所以为了生成随机char我们做二进制OR'|'随机A(0或32)和随机代码从acharCaseBit(65到90)。

A

0
投票

以下是生成随机字母数字代码的代码。首先,您必须声明一串允许的字符,并将其包含在随机数中。还要定义字符串的最大长度

Z

使用toString()方法从StringBuilder获取String


0
投票

如果您只想生成十六进制值,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(); } 也是一个很好的解决方案:

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

-1
投票

如果您不介意在代码中添加新库,可以使用polygenelubricants' answer生成字符(免责声明:我是作者之一)。

/** 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;
}

-2
投票
MockNeat

应该注意你想要的东西,假设你考虑'0,'1','2'..作为字符。


115
投票

要在a-z中生成随机字符:

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

67
投票

您还可以使用Apache Commons项目中的RandomStringUtils:

RandomStringUtils.randomAlphabetic(stringLength);

9
投票
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中的值。


4
投票
String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

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

这个也适用。


3
投票

在以下97 ascii值小“a”。

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个数字以上,如果你想要a到z的所有字符,那么你将3个数字替换为25。


1
投票

你可以使用Quickcheck specification-based test framework的发电机。

要创建随机字符串,请使用anyString方法。

String x = anyString();

您可以使用更受限制的字符集或最小/最大大小限制来创建字符串。

通常,您将运行具有多个值的测试:

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

1
投票

使用dollar

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

注意:条件qazxsw poi由qazxsw poi检查

编辑

正如史蒂夫正确指出的那样,n > 0每封信最多使用一次。作为解决方法,您可以在调用slice之前重复字母randomString次:

m

或者只是提供你的字母作为shuffle

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

1
投票

试试这个..

String
© www.soinside.com 2019 - 2024. All rights reserved.