【问题标题】:How can I put a certain amount of integers in random locations in a 2d array?如何将一定数量的整数放在二维数组的随机位置?
【发布时间】:2017-03-12 18:55:14
【问题描述】:

我正在尝试将一定数量的整数放入随机点的数组中,而不是将它们放在同一个位置。

我的 combine 方法连接两个给定的整数并返回 Int。 Places 是一个数组列表,用于保存已放入数组的整数的位置。 random 方法返回两个给定整数之间的随机整数。

combine 方法有效,random 方法也有效,但我不确定为什么它不起作用。

public void fillOne(int b)
{
    for(int x = 0; x < b; x++)
    {
        int kachow = random(0, 5);
        int kachigga = random(0, 5);
        int skrrt = combine(kachow, kachigga);
        if(notInArray(skrrt))
        {
            locations[kachow][kachigga] = 1;
            places.add(skrrt);
        }
    }
}

【问题讨论】:

  • notInArray 是如何工作的?有什么搭配吗?有什么地方吗?因为在这种情况下您不发送 kachow 和 kachigga 我假设您列表中的任何匹配都会使其为假,因此所有可能的随机 0,5 将被快速填充
  • 您有一个名为位置的二维数组,并且您试图将 1 放在其中的随机位置??

标签: java


【解决方案1】:

您还没有真正解释什么不起作用。但是您的算法中的一个明显缺陷是不能保证将b 元素设置为1。如果您的算法生成重复位置,那么它将设置少于 b 的元素。

您存储组合位置的逻辑过于复杂。一种解决方案是颠倒逻辑:生成一个表示两个维度的整数,然后在设置位置时将其分成两部分。这使得检查更加简单。

例如,如果您的数组是 5x5:

Set<Integer> positions = new HashSet<>();
while (positions.size() < n)
    positions.add(random.nextInt(25));
for (int p: positions)
    locations[p/5][p%5] = 1;

因为positions 是一个集合,它会自动排除重复项,这意味着代码将不断添加随机位置,直到它们成为集合中n 的不同位置。

如果您使用的是 Java 8,那就更简单了:

random.ints(0, 25)
    .distinct().limit(n)
    .forEach(p -> locations[p/5][p%5] = 1);

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 2023-03-21
    • 2017-10-07
    • 2019-08-04
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2022-01-11
    相关资源
    最近更新 更多