我设法根据种子做出随机序列,但现在我正在尝试别的东西。基本上,它生成一个数字(基于种子),然后检查该数字是否已经在数组中,然后如果它不在数组中,则将其添加到数组中,如果是,则进行到下一个。但是,我的程序工作正常,直到它达到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]);
}
}
答案 0 :(得分:1)
将问题分解为部分,首先是在value
和letters
之间的0
中测试p
的方法
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;
}
然后,fill
int[]
方法Random
提供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;
}
循环,而下一个符号已经存在。像,
Arrays.toString(int[])
然后你可以调用它(你可以使用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));
}
)输出数组,如
attr
答案 1 :(得分:0)
两个快速修复:
for(int i = 0; i < 25; i++)
//Your code
}
if (letters[x] == c) {
isSame = true;
}
答案 2 :(得分:0)
看起来你想要将数字0-25混乱,也就是说,将每个数字恰好存储一次,但是在数组中的随机位置。这也称为生成随机排列。假设是这种情况,那么您的代码有两个问题:
isSame
需要设置为false,否则一旦重复一个数字,isSame
对于所有后续数字都为真,并且没有任何新内容写入阵列
当选择已经在数组中的随机数时(当发现isSame为真时),需要为该索引找到一个新数字。在您的代码中,将跳过该索引,并且该索引处的值将默认为0.
也许值得一提的是,针对这个问题有更有效的算法。这种方法将继续挑选大量随机数,然后丢弃,这是浪费。 Fisher-Yates shuffle解决了这个问题(来自维基百科的伪代码):
for i from 0 to n−2 do
j ← random integer such that i ≤ j < n
exchange a[i] and a[j]