我正在用随机整数1-10填充数组,但是当我这样做的时候,我需要检查整数是否已经在数组中。我用整数填充数组没有问题,但是我检查重复整数的代码不能正常工作。
package arrayPackage;
import java.util.Arrays;
import java.util.Random;
public class BruteForce
{
//declare an integer array with 10 numbers.
int[] array = new int[10];
Random randomInt = new Random(); //random number generator
public void shuffle()
{
//int prevInt=0;
for(int i = 0; i < array.length; i++) //for each integer in the array pick a random integer and place in array
{
int temp = 1 + randomInt.nextInt(array.length);
for(int j = i; j < array.length; j++)
{
if(temp != array[j] && temp!= array[i])
{
array[i] = temp;
}
}
}
}
public void displayArray()
{
System.out.println(Arrays.toString(array));
}
}
这是很容易编写一个有缺陷的洗牌算法,这就是为什么存在一个良好的洗牌内置:
http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List)
如果你的目标是拥有一个1到10的整数数组,然后将它们洗牌,那么试试以下方法:
private static int[] array = new int[10];
public static void main(String[] args){
// Fill the array
for(int i = 0; i < array.length; i++)
array[i] = i + 1;
shuffle(array);
System.out.println(Arrays.toString(array));
}
private static void shuffle(int[] array){
if(array != null && array.length > 2){
Random randomGenerator = new Random();
for(int i = array.length - 1; i > 0; i--){
int randomIndex = randomGenerator.nextInt(i + 1);
// swap
int a = array[randomIndex];
array[randomIndex] = array[i];
array[i] = a;
}
}
}
如果你的目标是拥有一个int数组,并且每次你想添加一个随机int检查,无论它是否还不存在,尝试使用这个算法获得一个带有排除项的随机int:
public int getRandomWithExclusion(Random rnd, int start, int end, int... exclude) {
int random = start + rnd.nextInt(end - start + 1 - exclude.length);
for (int ex : exclude) {
if (random < ex)
break;
random++;
}
return random;
}
有关如何使用它的信息,请参见此处的SO回答。唯一的问题是排除数组,它每次都应该改变大小,所以它只包含排除的int,而不是在创建大小为10的int数组时默认的0
。否则exclude.length
总是返回10,使算法毫无用处。
似乎你想要一个1,2,3,。。。,10个随机分布。
以下解决方案更好,因为它只需要正好10个随机调用:
int array = new int[10];
for (int i = 0; i < 10; i++)
{
array[i] = i + 1;
}
for (int i = 0; i < 10; i++)
{
int to = randomInt.nextInt(array.length - i) + i; // get random swap target between i and 9
swap(array[i], array[to]); // I assume Java has swap function
}
到目前为止,这就是我得到的,但我不太确定接下来该怎么办。我(认为)这里发生的是,它到达数组的第一个位置,在0,0处,并生成一个数字。然后转到1,1和2,2,依此类推。我不确定该从那里开始,我相信有一种更有效的方法可以一次填充整行或整列。 此外,我的编译器不允许我像平时一样使用cout或endl?它坚持我使用std::cout,我只是想知道为什么。
@PeterLawrey我稍微调整了代码如下,因为我只需要洗牌,这是一个享受,我会弹出卡片的堆栈来处理 感谢彼得和所有其他贡献者。M.
问题内容: 如何检查Java整数是否为另一个数字的倍数?例如,if 是4的倍数。 问题答案: 使用余数运算符(也称为模运算符),该运算符返回除法的余数,并检查其是否为零:
问题内容: 我有一个数组,其中填充了6个随机生成的数字。首先,它生成一个介于1和49之间的随机数,然后将其与数组中的数字进行比较。如果发现重复,则应再次生成一个随机数,然后再次执行检查。如果没有重复项,则将数字添加到数组中。 这是代码: 但是,由于某种原因,它仍然允许重复,尽管很少(大约50个数组中的1个),例如。但是,当我尝试通过取出随机数元素并使用30这样的数字来重复此操作时,我无法重现结果。
我必须用奇数的范围(这里是)填充数组:1,3,5,7,9...但我总是在每个奇数之间有一个0,我不明白为什么。 注:注释中大写字母下的代码是由我们的教授给出的... 输出:
这可能吗?如果可能,我该如何正确地做到这一点?希望能够检查它是否包含1和2,如果是,继续与程序。