是否有在Java中生成随机字符的功能?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有在Java中生成随机字符的功能?相关的知识,希望对你有一定的参考价值。
Java是否具有生成随机字符或字符串的任何功能?或者只需选择一个随机整数并将该整数的ascii代码转换为字符?
有很多方法可以做到这一点,但是,是的,它涉及生成随机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 generator的linear congruence formula。你提到了密码学的必要性;在这种情况下,您可能想要研究使用更强大的cryptographically secure pseudorandom number generator(例如java.security.SecureRandom
)。
这是一个简单但有用的发现。它定义了一个名为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的书,我在这些书中引用了这些知识并在我的项目中使用。
注意:如果您不熟悉重载的方法,简而言之,方法重载是一种允许类具有多个具有相同名称的方法的功能,如果它们的参数列表不同。
看看Java 课程。我认为你可以使用randomize(char [] array)方法随机化一个字符。
我建议用混合大小写生成随机字符串,如:“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)和随机代码从a
到charCaseBit
(65到90)。
A
以下是生成随机字母数字代码的代码。首先,您必须声明一串允许的字符,并将其包含在随机数中。还要定义字符串的最大长度
Z
使用toString()方法从StringBuilder获取String
如果您只想生成十六进制值,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));
}
如果您不介意在代码中添加新库,可以使用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;
}
MockNeat
应该注意你想要的东西,假设你考虑'0,'1','2'..作为字符。
要在a-z中生成随机字符:
Random r = new Random();
char c = (char)(r.nextInt(26) + 'a');
您还可以使用Apache Commons项目中的RandomStringUtils:
RandomStringUtils.randomAlphabetic(stringLength);
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中的值。
String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char letter = abc.charAt(rd.nextInt(abc.length()));
这个也适用。
在以下97 ascii值小“a”。
public static char randomSeries以上是关于是否有在Java中生成随机字符的功能?的主要内容,如果未能解决你的问题,请参考以下文章