【问题标题】:How to randomly choose from a varying array of elements如何从不同的元素数组中随机选择
【发布时间】:2014-03-22 06:35:52
【问题描述】:

我的问题在概念上很简单: 我有一个包含 24 个布尔值的数组,最初我将它们全部设置为 false。我可以用代码随机选择这个数组的一个元素:

Random r = new Random();
int i1=r.nextInt(24);

现在我不时将一些元素的值更改为真,假设元素编号为 14 和 22。我现在如何仅在其他仍然为假的元素之间随机选择而不考虑那些为假的元素真的?提前感谢您的回答。

编辑: 工作的代码是:

Random r = new Random ();
int rand = r.nextInt (24);

while (array[rand]) {
          rand = r.nextInt (24);

        }

【问题讨论】:

  • 伪代码 - do (get random array element) while (random element == true)

标签: java arrays random boolean


【解决方案1】:
int numberTrue=0; //adjust this in your other code accordingly
Random r = new Random ();
int rand = r.nextInt (24);
// loop until not true found or stop if all items are true
while (array [rand] && numberTrue < 24) {
  rand = r.nextInt (24);
  count++;
}

我想了想,在不知道您的代码的情况下,这里有一些建议可以避免当它们都为真时出现无限循环(假设条件可能存在):
1. 计算设置了多少 true(为此调整了示例)
2.存储第二个真实索引数组,如另一个答案中所建议的那样

第一个可能是最容易实现的(在适当的代码点添加numberTrue++;numberTrue--;)- 这里只是一个注释,如果不能保持这个计数,你可以实现相同的通过在数组上运行初始 for 循环并计算真实元素的数量来实现。
第二种方法适合利用另一篇文章中的一个答案:

public int generateRandom(int start, int end, ArrayList<Integer> excludeRows) {
    Random rand = new Random();
    int range = end - start + 1;

    int random = rand.nextInt(range) + 1;
    while(excludeRows.contains(random)) {
        random = rand.nextInt(range) + 1;
    }

    return random;
}

(我相信他们的代码实际上应该是rand.nextInt(range) + start
所以你会运行:

if (trueIndexes.length < 24) {
      generateRandom(0, 23, trueIndexes);
    }

【讨论】:

  • 另外,如果你想提高效率,那么这个关于从随机数中排除一些数字的问题可能会对你有所帮助:stackoverflow.com/questions/14935997/…
  • 是的,我想我会使用那个while循环。现在正在看链接,好像很有用,谢谢
  • 我正在重新查看代码,也许我不太理解,但在我看来,它尝试了 24 次来生成该数字。如果我在 24 日有 1 次机会生成所需的数字并不意味着如果我尝试 24 次我肯定会生成它...它可能需要 5 次或 20 次或 30 次或 100 次或更长时间,因为是概率性的
  • 是的,我也看到了——所以调整了答案。我想到了几种方法(除了最初在数组上运行 -another- for 循环)来确定何时停止
【解决方案2】:

例如,您可以在ArrayList 中跟踪元素具有true 值的索引。生成随机数时,检查它是否等于已经存在的 true 数字之一(应从随机数生成/选择中排除)并重新生成随机数,直到获得数组索引之一还在false

【讨论】:

  • 是的,但问题是当初始数组(我想要随机的那个)将在 24 个总元素中的 23 个处填充真实元素时,在这种情况下,我将随机 23 个直到我找到仍然是假的那个人,对吗?只是想要更有效的东西,但如果我找不到其他东西,那就是解决方案
【解决方案3】:

您可以创建具有“false”的布尔元素列表并随机选择该列表中的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多