我这里有一个2D数组,我用随机数填充。我按如下方式填充我的数组:
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
{
nums[i][j] = 1 + (int)(Math.random() * 60);
}
}
我希望我的数组的数字介于0和60之间,因此:
* 60
我这样显示我的数字:
System.out.println("Nums are: " + nums[0][0]+ " " + nums[0][1]+ " " + nums[0][2]+ " " + nums[0][3]+ " " + nums[0][4]);
,输出看起来像这样
Nums是:43 6 32 6 12
我想用随机数填充我的数组,但我不希望它有匹配的数字,所以对于这个实例,数字6在数组中两次。我想从数组中删除重复项,或者根本不将它们放在数组中。
我想这样做的方法是在我的循环中有2个额外的for循环,其值大于0,这样我就可以有一个if语句来检查数组中的当前位置是否等于接下来,像这样:
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
{
nums[i][j] = 1 + (int)(Math.random() * 60);
for(int l = 1; l < 3; l++){
for(int m = 1; m < 5; m++){
if(nums[i][j] == nums[l][m]){
nums[i][j] = 1 + (int)(Math.random() * 60);
}
}
}
正如你在这里看到的,我添加了l和m,它们都有一个数字1,这将使它们位于前一个位置之上。此外,我的if语句检查值是否相同,如果是,则再次对数字进行randoms。
这对我不起作用,请有人帮我一把,我做错了什么?
答案 0 :(得分:0)
你可以这样做
git bisect
在这种情况下,我使用了Stack。
答案 1 :(得分:0)
您可以简单地使用Set
来跟踪您已经看过的数字,并定义一个新函数来封装您的“生成唯一随机数”逻辑。这将比每次生成值时检查2D数组的值更容易。对于初学者来说,嵌套循环令人困惑,但Set
也更可取,因为它具有常量(即O(1)
)查找时间,因此它可以快速找到值。
private final Set<Integer> usedValues = new HashSet<>();
private void populateArray(int[][] nums) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
nums[i][j] = getUniqueRandomNum();
}
}
}
private int getUniqueRandomNum() {
int val;
do {
val = 1 + (int) (Math.random() * 60);
} while (usedValues.contains(val));
usedValues.add(val);
return val;
}
答案 2 :(得分:0)
将您的数字存储在数组中并删除已使用的数字
LinkedList<Integer> integers = new LinkedList<Integer>();
for (int i = 0; i < 60; i++) {
integers.add(i);
}
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
{
int random = 1 + (int)(Math.random() * integers.size());
nums[i][j] = integers.remove(random);
}
}
答案 3 :(得分:0)
试试这个
public static int[][] random(int i, int j, int max) { // 3, 5, 60
Supplier<Integer> function = new Supplier<Integer>() {
final Set<Integer> ints = new HashSet<>();
final Random r = new Random();
@Override
public Integer get() {
int n;
while (ints.contains(n = r.nextInt(max)))
;
ints.add(n);
return n;
}
};
int[][] matrix = new int[i][j];
IntStream.range(0, i * j).forEach(in -> matrix[in % i][in % j] = function.get());
return matrix;
}
或仅使用ThreadLocalRandom
public static int[][] random(int i, int j, int max) {
List<Integer> random = ThreadLocalRandom.current().ints(0, max).distinct().limit(i * j).collect(ArrayList::new, List::add, List::addAll);
int[][] matrix = new int[i][j];
IntStream.range(0, i * j).forEach(in -> matrix[in % i][in % j] = random.get(in));
return matrix;
}
答案 4 :(得分:-1)
你不需要删除&#34;它们之前的位置&#34;,你必须创建另一个循环来检查新的Math.ramdom()
是否等于数组的元素。
我会告诉你代码:
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
{
int numRam = (int)(Math.random() * 60);
bool check = true;
for(int l = 1; l < (Size of the array); l++){
if(nums[i][l] == numRam){
check = false;
break;
}
}
if(!check){ //If the number exist you do j - 1
j--; //so you would try with a different ramdom number
}else{
nums[i][j] = numRam;
}
}
}
答案 5 :(得分:-1)
你也可以试试这个:
int end = arr.length;
Set<Integer> set = new HashSet<Integer>();
for(int i = 0; i < end; i++){
set.add(arr[i]);
}
我找到了一个修复程序,我不确定它是否适用于您的代码,但它可以尝试。
Class HashSet
如果尚未将指定的元素添加到此集合中 本。