Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不重复的情况下生成随机字符?_Java_Random - Fatal编程技术网

Java 如何在不重复的情况下生成随机字符?

Java 如何在不重复的情况下生成随机字符?,java,random,Java,Random,如果再次调用,我希望函数从A-Z生成随机字符而不重复。例如,我首先在main中调用它,它生成一个角色。如果我第二次调用它,它应该不会再次生成一个。怎么做 public static void random(){ Random r = new Random(); char c = (char)(r.nextInt(26) + 'A'); System.out.print(c); } 如果这有帮助的话,我打算把它作为一个键放在hashmap上,它不应该有相同的字符。我想你可

如果再次调用,我希望函数从A-Z生成随机字符而不重复。例如,我首先在main中调用它,它生成一个角色。如果我第二次调用它,它应该不会再次生成一个。怎么做

public static void random(){
    Random r = new Random();
    char c = (char)(r.nextInt(26) + 'A');
    System.out.print(c);
}

如果这有帮助的话,我打算把它作为一个键放在hashmap上,它不应该有相同的字符。

我想你可以使用这样的代码列表

public static void main(String args[]) {
    List<Character> listChar = new ArrayList<>();
    //put all your character in this list
    for (int i = 0; i <= 26; i++) {
        char c = (char) (i + 'A');
        listChar.add(c);
    }
    Random r = new Random();
    int id = r.nextInt(listChar.size());
    char c = (char) (id + 'A');
    System.out.print(c);
    listChar.remove(id); 
}
publicstaticvoidmain(字符串参数[]){
List listChar=new ArrayList();
//把你所有的角色都放在这个列表中

对于(int i=0;i我成功地修复了它。如果有人想知道如何修复,我会保持这个论坛。它在hashmap中,所以我只需要设置一个条件
hashmap.containsKey()


当您有一个较小的固定限制时,更经济的做法是预先生成整个随机序列,然后一次只取一个字符:

List<Character> sequence = new ArrayList<>();
for (char c = 'A' ; c <= 'Z' ; c++) {
    sequence.add(c);
}
Collections.shuffle(sequence);
for (Character c : sequence) {
    System.out.print(c);
}
List sequence=new ArrayList();

对于(char c='A';c我认为最合适的方法是使用以下结构:

//为随机字符串定义有效符号
允许的私有静态最终字符串_CHARACTERS=“0123456789ABCDEFGHIjklmnopqrStuvxyzabCDEFGHIjklmnopqrStuvxyz”;
//生成字符串
公共字符串随机字符串(int-len){
StringBuilder sb=新StringBuilder(len);
对于(int i=0;i
我设置了一个条件,它也能工作,但我认为它也能工作。谢谢!你很高兴你的修复被破坏了。它很可能会产生重复。发生这种情况的原因是无法保证随机生成器不会连续产生两个冲突。你的代码假设第二个
r.nextInt(26)不会碰撞,但它不是真的。考虑一个哈希图,填充了26个位置中的25个。击中未填充点的概率非常低,所以第二个调用不会给你一个唯一的点的机会非常高。@达斯布林克恩亮你是正确的!谢谢你通知我。我试过你的修复,它肯定是有效的。谢谢!H!这到底能解决不重复结果的问题吗?这限制了字符集,但OP并没有这样问。
List<Character> sequence = new ArrayList<>();
for (char c = 'A' ; c <= 'Z' ; c++) {
    sequence.add(c);
}
Collections.shuffle(sequence);
for (Character c : sequence) {
    System.out.print(c);
}
// define valid symbols for random string 
private static final String ALLOWED_CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
// generate the string
public String randomString(int len) {
    StringBuilder sb = new StringBuilder(len);
    for (int i = 0; i < len; i++) {
        sb.append(ALLOWED_CHARACTERS.charAt(secureRandom.nextInt(ALLOWED_CHARACTERS.length())));
    }
    return sb.toString();
}