Java 如何生成没有重复编号的4位pin码

Java 如何生成没有重复编号的4位pin码,java,android,random,Java,Android,Random,我是android编程新手,我想制作一个4位数的PIN发生器,不需要重复。我该怎么做??我还不知道如何很好地循环。谢谢 我已经尝试过随机,但它给了我重复的数字 int randomPIN = (int)(Math.random()*9000)+1000; String pin = String.valueOf(randomPIN); dummy.setText(pin); 我在寻找135446823645的结果,但结果大多是334465771988你必须一步一步地添加随机整数并检查重复项 R

我是android编程新手,我想制作一个4位数的PIN发生器,不需要重复。我该怎么做??我还不知道如何很好地循环。谢谢

我已经尝试过随机,但它给了我重复的数字

int randomPIN = (int)(Math.random()*9000)+1000;

String pin = String.valueOf(randomPIN);
dummy.setText(pin);

我在寻找135446823645的结果,但结果大多是334465771988

你必须一步一步地添加随机整数并检查重复项

Random random = new Random();
int rdmInt = random.nextInt(9);
String pin = "";
while (pin.length() < 4) {
    rdmInt = random.nextInt(9);
    String addition = String.valueOf(rdmInt);
    if (pin.contains(addition)) continue;
    pin += addition;
}
Random Random=new Random();
int rdmInt=random.nextInt(9);
字符串pin=“”;
while(pin.length()<4){
rdmInt=random.nextInt(9);
字符串加法=String.valueOf(rdmInt);
如果(销包含(添加))继续;
pin+=加法;
}

//创建列表ArrayList编号=新建ArrayList();
Random randomGenerator=新的Random();while(numbers.size()<4){int random=randomGenerator.nextInt(4);if(!numbers.contains(random)){numbers.add(random);}}

创建数字列表,将其洗牌,并返回前四位数字。以下是一种静态方法:

/* No need for a new list each time */
private static final List<Integer> digits =
    new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));

/**
 * Returns a PIN string that contains four distinct digits.
 */
public static String nextPin() {
    Collections.shuffle(digits);
    final StringBuilder sb = new StringBuilder(4);
    for (Integer digit : digits.subList(0, 4)) {
        sb.append(digit);
    }
    return sb.toString();
}
/*每次都不需要新列表*/
私有静态最终列表数字=
新的ArrayList(Arrays.asList(0,1,2,3,4,5,6,7,8,9));
/**
*返回包含四个不同数字的PIN字符串。
*/
公共静态字符串nextPin(){
集合。洗牌(数字);
最终StringBuilder sb=新StringBuilder(4);
for(整数:数字。子列表(0,4)){
某人追加(数字);
}
使某人返回字符串();
}
显然,如果您希望将数字作为数字数组而不是字符串,那么处理子列表的方式与我在这里展示的方式不同


如果您只是返回子列表本身,请注意,每次您进行某种学术练习时,它都会发生更改-下面是一个需要Java 8的练习:

    // flag to control if you want number sequence to be the same each run
    boolean repeatable = true;

    // seed for randomness - for permutation of list (not the integers)
    Random rnd = new Random((repeatable ? 3 : System.currentTimeMillis()));

    // generate randomized sequence as a List
    List<Integer> myNums;
    Collections.shuffle((myNums = IntStream.rangeClosed(1000, 9999).boxed().collect(Collectors.toList())), rnd);

    // Work with list...
    for (Integer somePin : myNums) {
        Log.i("", "Next PIN: "+somePin);
    }
//用于控制每次运行的编号顺序是否相同的标志
布尔可重复=真;
//随机性种子-用于列表排列(不是整数)
Random rnd=新的Random((可重复?3:System.currentTimeMillis());
//生成随机序列作为列表
列出八哥;
Collections.shuffle((myNums=IntStream.rangeClosed(10009999.boxed().collection(Collectors.toList())),rnd);
//使用列表。。。
for(整数somePin:myNums){
Log.i(“,”下一个PIN:“+somePin”);
}

您检查过了吗?由于您是编程新手,这对您来说是一个需要自己解决的大问题,但这里有一点关于如何继续的提示:从获取第一个随机数字开始,然后继续尝试获取第二个不是第一个的随机数字;然后继续尝试获取第三个随机数字,而不是前两个数字中的任何一个,依此类推。我会感谢你!!!我想我找到办法了谢谢你们的帮助!!为什么要故意降低PIN的安全性?通过消除重复数字,您可以将代码空间减少一半以上,因为只有4536个代码符合您的标准。我可以使用以下哪一个变量来显示?因为pin显示10个整数,所以在发布之前应该测试代码。很抱歉,我以前没有测试我的代码,现在它是正确的;Random randomGenerator=新的Random();while(numbers.size()<4){int random=randomGenerator.nextInt(4);if(!numbers.contains(random)){numbers.add(random);}