如何生成随机字符而不重复?

时间:2016-05-08 09:35:25

标签: java random

我想让函数从A-Z生成随机字符而不重复,如果再次调用它。例如,我首先在我的主要调用它,它生成一个A字符。如果我第二次打电话,它不应再生成A.怎么做?

HashMap

如果这有帮助,我计划将它作为一个键放在一个hashmap上,它不应该有相同的字符。

4 个答案:

答案 0 :(得分:1)

我认为你可以使用像这个代码片段的列表,

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

我希望这可以给你和想法

答案 1 :(得分:1)

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

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

上述方法会创建sequence所有字母AZ,然后将random shuffle应用于demo

您获得的序列是随机顺序。你可以从中取出物品,而不必担心它们会重复。

答案 2 :(得分:0)

我设法解决了这个问题。如果有人想知道如何,我会保持这个论坛。它在一个hashmap中,所以我只是设置了hashmap.containsKey()

的条件
    Random r = new Random();
    char c = (char)(r.nextInt(26) + 'A');
    if(hm.containsKey(c)){
        c = (char)(r.nextInt(26) + 'A');
        hm.put(c, newValue);
    }
    else
        hm.put(c, newValue);

答案 3 :(得分:0)

我认为最合适的方法,只需使用以下SecureRandom构造:

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