我想将随机数存储在数组中而不重复,范围为0-9。如果他们重复,但没有,如果他们正好相邻,那就没关系了:1577984是不正确的(因为双7s)但理论上151515没问题。
我已经在这一天或两天工作,这是我原来的基本代码:
public static int[] createRandomNumber(int characters){
int randomNumberArray[] = new int[characters];
for(int i =0; i<characters; i++){
randomNumberArray[i] = (int)(Math.random()*9);
}
return randomNumberArray;
}
这就是我现在所拥有的,但它与我想要的完全相反,产生了所有相同的数字:
public static int[] createRandomNumber(int characters)
{
int randomNumberArray[] = new int[characters];
int random = (int)(Math.random()*9);
for(int i = 0; i <characters ; i++)
{
randomNumberArray[i] = random;
if(randomNumberArray[i] == random)
randomNumberArray[i] = (int)(Math.random()*9);
else if(randomNumberArray[i] != random)
randomNumberArray[i] = random;
}
return randomNumberArray;
}
我有没有看到一个简单的解决方案?我可能会重写这种方法50次 只是你知道参数代码是
int characters = in.nextInt();
所以只需要他们想要的随机生成密码的长度。另外我知道Math.random是伪随机的,但这不是真实的或任何东西。此外,还有更多方法可以生成随机字母,例如井。 (是的,我做了很多研究,但没有人似乎有我的特殊问题,相信我提出问题对我来说是最后的选择。)
感谢您的任何建议。
答案 0 :(得分:1)
在for
循环中,您将random
分配给数字数组。但是,您会立即检查random
是否等于您刚刚分配的那个点,即true
。因此它会选择另一个随机数,也可能与前一个数字相等或不同。
我已经重写了for
循环,在其正文中有一个while
循环,以便继续检查之前的数字以查看是否有重复的数字。
for(int i = 0; i <characters ; i++)
{
randomNumberArray[i] = random;
// If not first, check if it matches the previous digit
while(i >= 1 && randomNumberArray[i - 1] == random)
{
random = (int)(Math.random()*9);
randomNumberArray[i] = random;
}
}
答案 1 :(得分:0)
这是另一种基于do-while的可能解决方案:
class TestArrayGen {
public static int[] createRandomNumber(int characters) {
int randomNumberArray[] = new int[characters];
randomNumberArray[0] = (int)(Math.random() * 10);
for(int i = 1; i < characters; i++) {
do {
randomNumberArray[i] = (int)(Math.random() * 10);
} while(randomNumberArray[i] == randomNumberArray[i-1]);
}
return randomNumberArray;
}
public static void main(String[] args) {
for(int number : createRandomNumber(20)) {
System.out.print(number + " ");
}
System.out.println();
}
}
请注意,我也将乘数提升至10,否则你永远不会得到9。