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

时间:2010-04-13 03:45:29

标签: java random

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

21 个答案:

答案 0 :(得分:114)

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

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

答案 1 :(得分: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

请注意,基于相当弱的pseudo-random number generatorjava.util.Random实际上是linear congruence formula。你提到了密码学的必要性;在这种情况下,您可能需要调查使用更强大的cryptographically secure pseudorandom number generator(例如java.security.SecureRandom)。

答案 2 :(得分:67)

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

RandomStringUtils.randomAlphabetic(stringLength);

答案 3 :(得分: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 :(得分:4)

String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

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

这个也适用。

答案 5 :(得分: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个。

答案 6 :(得分: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();
}

NB :条件n > 0slice

填充

编辑

正如史蒂夫正确指出的那样,randomString每封信最多使用一次。作为解决方法 您可以在致电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);

答案 7 :(得分: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
  }
}

答案 8 :(得分:1)

试试这个..

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

}

答案 9 :(得分:1)

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

Windows

为演示其工作原理,让我们看一下下面的测试程序,该程序显示175个随机的小写字母。

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

,输出为:

enter image description here

如果您再次运行一次:

enter image description here

我对 Y.Daniel Liang 的著作Introduction to Java Programming, Comprehensive Version, 10th Edition,表示赞赏,在其中我引用了这些知识并在我的项目中使用了这些知识。

注意:如果您不熟悉重载的方法,则简而言之,方法重载是一项功能,如果一个类的参数列表不同,它可以使一个类拥有多个具有相同名称的方法。

答案 10 :(得分:0)

如果您只想生成十六进制值,

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

答案 11 :(得分:0)

看看Java Randomizer类。 我想你可以使用randomize(char [] array)方法随机化一个字符。

答案 12 :(得分:0)

我建议使用混合大小写生成随机字符串,例如:&#34; DthJwMvsTyu&#34;
当代码a-z(97到122)和A-Z(65到90)的第5位(2 ^ 5或1 <5或32)时基于ASCII码的字母的算法不同

random.nextInt(2):结果为0或1.

random.nextInt(2) << 5:结果为0或32。

A为65,下a为97.差异仅在第5位(32)上,因此为了生成随机字符,我们进行二进制OR&#39; |&#39;随机charCaseBit(0或32)以及从AZ的随机代码(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();
}

答案 13 :(得分:0)

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

 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获取字符串

答案 14 :(得分:0)

实际上,上述方法不会生成真正的随机字符。要生成真正的随机字符,您应该给它一个随机种子!例如时间(以毫秒为单位)。此代码生成10个随机字符,然后将其转换为字符串:

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

答案 15 :(得分:0)

我使用这个:

useReducer

答案 16 :(得分:0)

java.util.Random 是迄今为止我尝试过的更有效的方法,具有 98.65% 唯一性的精确度。 我提供了一些测试,这些测试生成 10000 个批次的 100 2 个字母数字字符字符串并计算平均值。

其他随机工具来自 commons.lang3 和 RandomStringUtils

java.util.Math

答案 17 :(得分:-1)

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

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

答案 18 :(得分:-1)

react-router-dom

答案 19 :(得分:-2)

   Random randomGenerator = new Random();

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

假设您将'0,'1','2'...视为字符,应该照顾您想要的内容。

答案 20 :(得分:-2)

这是一个简短的答案:

import java.util.UUID;

UUID.randomUUID();