我设法根据种子生成了一个随机序列,但现在我正在尝试其他方法。基本上,它生成一个数字(基于种子),然后检查该数字是否已在数组中,如果不在数组中,则将其添加到数组中,如果是,则继续到下一个数组。然而,我的程序运行得很好,直到它达到0,然后它就一直重复0。下面是我的代码:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter a seed(One letter)");
String input = s.nextLine();
char a = input.charAt(0);
int b = ((int) a) - 96;
Random rnd1 = new Random(b);
int[] letters = new int[25];
boolean isSame = false;
for(int i = 0; i < 26; i++)
{
int c = rnd1.nextInt(26);
for(int x = 0; x < i; x++)
{
if(letters[x] == c)
{
isSame = true;
}
}
if(isSame == false)
{
letters[i] = c;
}
System.out.println(letters[i]);
}
}发布于 2017-01-08 11:19:31
将问题分成几部分,首先使用一个方法在索引0和p之间测试letters中的value,如下所示
private static boolean match(int[] letters, int p, int val) {
for (int i = 0; i < p; i++) {
if (letters[i] == val) {
return true;
}
}
return false;
}然后提供一种方法,将具有提供的Random的int[] fill到给定的length。由于您希望int[]是唯一的,因此可以在下一个符号已经存在的情况下使用内部do while循环。喜欢,
private static int[] fill(Random rnd1, int length) {
int[] letters = new int[length];
for (int i = 0; i < length; i++) {
int c;
do {
c = rnd1.nextInt(length);
} while (match(letters, i, c));
letters[i] = c;
}
return letters;
}public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter a seed(One letter)");
String input = s.nextLine();
char a = input.charAt(0);
int b = ((int) a) - 96;
Random rnd1 = new Random(b);
int[] letters = fill(rnd1, 26);
System.out.println(Arrays.toString(letters));
}发布于 2017-01-08 11:22:36
两个快速修复方法:
1)由于您的数组的长度为25,因此for循环将上升到索引25,该索引为ArrayIndexOutOfBoundsException。
for(int i = 0; i < 25; i++)
//Your code
}2)将此代码替换为满足条件的代码,并生成一个新的随机数,然后将其赋值给array。
if (letters[x] == c) {
isSame = true;
}发布于 2017-01-08 11:31:30
看起来您想要将数字0-25打乱,也就是说,将每个数字只存储一次,但存储在数组中的随机位置。这也称为生成随机排列。假设是这种情况,那么您的代码存在两个问题:
当您挑选一个新的随机数时,需要将
isSame设置为false,否则一旦某个数字重复,则所有后续数字的isSame都为true,并且不会向数组中写入任何新的内容。也许还值得一提的是,对于这个问题,有更有效的算法。这种方法将继续挑选大量随机数,然后将其丢弃,这是浪费的。Fisher-Yates混洗解决了这个问题(来自维基百科的伪代码):
for i from 0 to n−2 do
j ← random integer such that i ≤ j < n
exchange a[i] and a[j] https://stackoverflow.com/questions/41529041
复制相似问题