理解用随机数填充数组(大Java Ex 7.4)
问题陈述理解用随机数填充数组(大Java Ex 7.4),java,arrays,Java,Arrays,问题陈述 class seq { private int[] arr; private int[] filledArr; private Random randNum; public seq() { randNum = new Random(); arr = new int[10]; filledArr = new int[10]; } public int [] generateNewA
class seq
{
private int[] arr;
private int[] filledArr;
private Random randNum;
public seq()
{
randNum = new Random();
arr = new int[10];
filledArr = new int[10];
}
public int [] generateNewArr()
{
for(int i = 1; i< 11 ; i++)
{
filledArr[i] = i;
}
return filledArr;
}
public int [] newArr()
{
for(int i=1; i < 11 ; i++)
{
int newRandNum = //RANDOM NUMBER IN filledArr;
arr[i] = newRandNum;
// REMOVE that random number from filledArr
}
}
}
编写一个程序,生成数字1到1的随机排列
10要生成随机排列,需要用数字1到10填充数组,以便数组中没有两个条目具有相同的值
目录你可以用蛮力,通过调用Random.nextInt
直到它生成一个尚未在数组中的值。相反,你
应该实施智能方法。制作第二个数组并用
数字是1到10。然后随机选取其中一个,将其移除,然后
将其附加到置换数组。重复10次。实现一个类
具有int[]nextPermutation方法的置换生成器
我很难理解这个问题的意思
我的解释是,我们需要将数字1-10放入数组中,给定一些从1到10的随机数
我解决这个问题的方法是简单地添加到一个数组并进行循环,然后检查下一个随机数是否已经在数组中。然而,根据问题,这被认为是“暴力”
通过实现第二个数组,我不太确定我的书在说什么。如果我做了第二个数组,我还需要检查数组中是否有东西
我的尝试
首先我试着把10个随机数放到一个数组中,忽略了它们必须是不同的部分。这是我的
private int[] arr;
private Random randNum;
public seq()
{
randNum = new Random();
arr = new int[10];
}
public int getRandNum()
{
int newNum = randNum.nextInt(10)+1;
return newNum;
}
public int [] filledArr()
{
for (int i = 0 ; i<arr.length; i++)
{
arr[i] = getRandNum();
}
return arr;
}
尝试使用ArrayList
import java.util.Random;
import java.util.ArrayList;
class seq
{
private ArrayList<Integer> arrListOne;
private ArrayList<Integer> arrListTwo;
private Random num;
public seq()
{
num = new Random();
arrListOne = new ArrayList<Integer>(10);
arrListTwo = new ArrayList<Integer>(10);
}
public ArrayList getFilledArr()
{
for(int i = 1; i < arrListOne.size()+1 ; i++)
{
arrListOne.add(i);
}
return arrListOne;
}
public ArrayList randNewArr()
{
for(int i = 0 ; i < 10 ; i++)
{
int randNum = num.nextInt(arrListOne.size())+1;
arrListTwo.add(arrListOne.get(randNum));
arrListOne.remove(arrListOne.get(randNum));
}
return arrListTwo;
}
public String toString()
{
String output = "The Randomized ArrayList is";
output+=arrListTwo;
return output;
}
}
public class Sequence
{
public static void main(String [] args)
{
seq seqObj = new seq();
seqObj.getFilledArr();
seqObj.randNewArr();
System.out.println(seqObj.toString());
}
}
import java.util.Random;
导入java.util.ArrayList;
类别seq
{
私人ArrayList arrListOne;
private ArrayList Arrlist 2;
私有随机数;
公开序号()
{
num=新随机数();
arrListOne=新的ArrayList(10);
arrListTwo=新的ArrayList(10);
}
公共数组列表getFilledArr()
{
对于(int i=1;i
问题是我必须调用getRandNum()10次才能得到10个不同的数字,然后调用filledar将其放入其中。这是大量的打字。有更好的办法吗
是的
使用以下命令:
public int [] filledArr()
{
for (int i = 0 ; i < arr.length; i++)
{
arr[i] = randNum.nextInt(10)+1;
}
return arr;
}
public int[]filledArr()
{
对于(int i=0;i
所以你编码得更少,结果是一样的
问题是我必须调用getRandNum()10次才能得到10个不同的数字,然后调用filledar将其放入其中。这是大量的打字。有更好的办法吗
是的
使用以下命令:
public int [] filledArr()
{
for (int i = 0 ; i < arr.length; i++)
{
arr[i] = randNum.nextInt(10)+1;
}
return arr;
}
public int[]filledArr()
{
对于(int i=0;i
因此,您编写的代码更少,结果是相同的。问题只是说: 制作一个数字为1-10的数组(不必随机排序)。然后 生成一个介于1-10之间的随机数,然后选择该数字并删除该索引 从前面创建的数组中 粗略的实施将是:
ArrayList nums = new ArrayList<Integer>(); // The arraylist with numbers from 1-10
for(int i = 1; i < 11; i++;)
nums.add(i);
Random r = new Random();
int x = r.nextInt(10);
int[] finalNums = new int[2];
finalNums[0] = nums.get(x);
nums.remove(x); // Remove the number at this index so it won;t be picked up again
x = r.nextInt(9); // Since we removed one index from arraylist, so total elements are now nine instead of 10.
finalNums[1] = nums.get(x);
nums.remove(x);
或者您也可以在seq
class'构造函数中调用这些方法:
public seq()
{
randNum = new Random();
arr = new int[10];
filledArr = new int[10];
this.getFilledArr();
this.randNewArr();
}
另外需要注意的是,显示ArrayList输出的方法是不正常。对您的代码稍加修改:
import java.util.Random;
import java.util.ArrayList;
class seq
{
private ArrayList<Integer> arrListOne;
private ArrayList<Integer> arrListTwo;
private Random num;
public seq()
{
num = new Random();
arrListOne = new ArrayList<Integer>();
arrListTwo = new ArrayList<Integer>();
getFillerArr();
randNewArr();
}
// You dont have to return ArrayList here
public void getFilledArr()
{
for(int i = 1; i < 11 ; i++)
{
arrListOne.add(i);
}
}
// You dont have to return ArrayList here
public void randNewArr()
{
for(int i = 0 ; i < 10 ; i++)
{
int randNum = num.nextInt(arrListOne.size())+1;
arrListTwo.add(arrListOne.get(randNum));
arrListOne.remove(arrListOne.get(randNum));
}
}
// A method that returns you random array list so you can easily use it following rules of encapsulation
public ArrayList<Integer> getRandomArray() {
return this.arrListTwo;
}
}
public class Sequence
{
public static void main(String[] args){
seq seqObj = new seq();
System.out.println(seq.getRandomArray());
}
}
说明:
arrListOne=newarraylist(10);
您正在尝试创建一个固定大小为10的数组列表?但是ArrayList没有固定的大小。所以这行不通。因此,此循环也会失败:
public ArrayList getFilledArr()
{
for(int i = 1; i < arrListOne.size()+1 ; i++)
{
arrListOne.add(i);
}
return arrListOne;
}
public ArrayList getFilledArr()
{
对于(int i=1;i
(数组列表的大小为0,因此循环不会运行)
因此,在获取随机数时会出现异常
PS:我的错,我已经有一段时间没有使用java了。不知何故,我在阅读代码时忽略了它。问题只是说: 制作一个数字为1-10的数组(不必随机排序)。然后 生成一个介于1-10之间的随机数,然后选择该数字并删除该索引 从前面创建的数组中 粗略的实施将是:
ArrayList nums = new ArrayList<Integer>(); // The arraylist with numbers from 1-10
for(int i = 1; i < 11; i++;)
nums.add(i);
Random r = new Random();
int x = r.nextInt(10);
int[] finalNums = new int[2];
finalNums[0] = nums.get(x);
nums.remove(x); // Remove the number at this index so it won;t be picked up again
x = r.nextInt(9); // Since we removed one index from arraylist, so total elements are now nine instead of 10.
finalNums[1] = nums.get(x);
nums.remove(x);
或者您也可以在seq
class'构造函数中调用这些方法:
public seq()
{
randNum = new Random();
arr = new int[10];
filledArr = new int[10];
this.getFilledArr();
this.randNewArr();
}
另外需要注意的是,显示ArrayList输出的方法是不正常。对您的代码稍加修改:
import java.util.Random;
import java.util.ArrayList;
class seq
{
private ArrayList<Integer> arrListOne;
private ArrayList<Integer> arrListTwo;
private Random num;
public seq()
{
num = new Random();
arrListOne = new ArrayList<Integer>();
arrListTwo = new ArrayList<Integer>();
getFillerArr();
randNewArr();
}
// You dont have to return ArrayList here
public void getFilledArr()
{
for(int i = 1; i < 11 ; i++)
{
arrListOne.add(i);
}
}
// You dont have to return ArrayList here
public void randNewArr()
{
for(int i = 0 ; i < 10 ; i++)
{
int randNum = num.nextInt(arrListOne.size())+1;
arrListTwo.add(arrListOne.get(randNum));
arrListOne.remove(arrListOne.get(randNum));
}
}
// A method that returns you random array list so you can easily use it following rules of encapsulation
public ArrayList<Integer> getRandomArray() {
return this.arrListTwo;
}
}
public class Sequence
{
public static void main(String[] args){
seq seqObj = new seq();
System.out.println(seq.getRandomArray());
}
}
说明:
arrListOne=newarraylist(10);
您正在尝试创建一个固定大小为10的数组列表?但是ArrayList没有固定的大小。所以这行不通。因此,此循环也会失败:
public ArrayList getFilledArr()
{
for(int i = 1; i < arrListOne.size()+1 ; i++)
{
arrListOne.add(i);
}
return arrListOne;
}
public ArrayList getFilledArr()
{
对于(int i=1;i
(数组列表的大小为0,因此循环不会运行)
因此,在获取随机数时会出现异常
PS:我的错,我已经有一段时间没有使用java了。不知何故,我在阅读代码时忽略了它。提示:似乎您没有理解建议的“智能”方法;会议应按以下程序进行:
Card deck[], temp;
int i, j;
// fill the deck
for (i = 0; i < 10; i++) deck[i] = i;
// Shuffle 'em. Runs stern-to-stem because of 'rand()'
for (i = 9; i > 0; i--) { // no need for (i == 0) ...
j = rand(i); // returns value in the inclusive range [0..i]
// it's just fine if (i == j) ... although it usually won't be ...
temp = deck[i]; // set-aside the card in the cursor-position
deck[i] = deck[j]; // replace it with the randomly-chosen card
deck[j] = temp; // then put the original card where it can get picked
}