【问题标题】:How to generate 3 different integers? [closed]如何生成 3 个不同的整数? [关闭]
【发布时间】:2017-01-05 15:12:56
【问题描述】:

我想重新生成一个随机 Int。我像这样生成 3 个 Int:

Random a = new Random();
int testa = a.nextInt(9 - 1) + 1;
Random b = new Random();
int testb = b.nextInt(9 - 1) + 1;
Random c = new Random();
int testc = c.nextInt(9 - 1) + 1;

如果其中 1 个相同,我想重新生成 Int。怎么样?

【问题讨论】:

  • 所以比较并重新生成...
  • 一个简单的 if else 语句就足够了
  • 看下面的答案,我不同意——看起来很简单,但是“初级”可能会在那里面临挑战......
  • 如果我这样做:textuploader.com/ddptc 它说“变量“testb”已经在范围内定义。我是这个编码的新手;)
  • 为什么要创建Random类的三个实例?这通常是不需要的,除非您有非常具体的原因并且您了解此类代码的含义。正如您所说,您是新手,将其视为错误并简化您​​的代码以仅使用一个 Random 实例。

标签: java android random int


【解决方案1】:

使用Set 并在循环内添加随机数,直到长度达到您需要的长度。

int rInt;
Random a = new Random();
Set<Integer> random = new HashSet<>();
while (random.size() < 3) {
    rInt = a.nextInt(9 - 1) + 1;
    random.add(rInt);
}

要从Set 获取随机整数,您可以使用Iterator 或使用ArrayList,如下所示,

List<Integer> list = new ArrayList<>(random);
int tempa = list.get(0);
int tempb = list.get(1);
int tempc = list.get(2);

需要进口,

import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.ArrayList;

我希望它有所帮助。 :)

【讨论】:

  • 由于 OP 对 Java 编程来说非常新鲜,也许您还应该添加示例如何使用 Set 中的值而不是 testa/b/c 局部变量。
  • @Ped7g 这不是一个我们向初学者解释难以置信的基本概念的网站。应该删除整个页面
  • @TimCastelijns 我通常赞成一些新手主题,但在这种情况下可能太多了,加上几个答案仍然在宣传不良实践代码,所以它们实际上具有误导性......是的,你是对的。
  • 如果您想帮助 Java 初学者,您可能不应该发布包含两个编译错误的代码。
  • 还有时间考虑一下……这可能会导致这些数字的意外排序,就像它们甚至可能一直排序一样,因为 HashSet 不会保持排序。所以你还应该有另一个数组int[3] intArrif (random.add(rInt)) { intArr[random.size()-1] = rInt; } 这样随机数的顺序就会被保存。在这一点上,接受的答案实际上更好,除了大量的随机实例。所以我要取消我的投票,因为这是无用的“高级”:)(Java 中的常见陷阱)。
【解决方案2】:

您可以先生成数字列表,然后再随机播放。然后从那个打乱的列表中一一窥视。

在这里查看我的答案:How to randomly pick element from array without repeating?

希望能帮到你!

【讨论】:

  • 当你想要八个可能值的三个随机数时,我明确推荐这个答案。没有显式的Random 实例,没有多次循环迭代的风险,甚至可以在没有显式循环的情况下完成。也没有Set 干扰您获取号码的顺序。
【解决方案3】:

您可以使用 while 语句,执行以下操作:

Random a = new Random();
int testa = a.nextInt(9 - 1) + 1;
Random b = new Random();
int testb = b.nextInt(9 - 1) + 1;
Random c = new Random();
int testc = c.nextInt(9 - 1) + 1;

while(testa != testb && testa != testc && testb != testc){
  Random a = new Random();
  testa = a.nextInt(9 - 1) + 1;
  Random b = new Random();
  testb = b.nextInt(9 - 1) + 1;
  Random c = new Random();
  testc = c.nextInt(9 - 1) + 1;
}

这只是应该不断生成新的随机整数,直到它们是 3 个不同的整数。

【讨论】:

  • 为什么要使用这个随机生成器代码两次?改用 do while。
  • 您还赢得了每秒创建的随机类实例数量最多的价格。 (这不是正面的)
【解决方案4】:

您应该记住,这不再是真正的“随机”了!所以不要将它用于安全相关的功能,例如生成一个随机的三位数!

Set<Integer> myRandoms = new Set<Integer>();
while(myRandoms.size() < 3)
{
// generate random value
  myRandoms.add(randValue);
}

为什么会这样?因为只有当其中的每个条目都是唯一的(彼此不同)时,集合才能增长。

【讨论】:

  • 为什么它不起作用? (1) 因为Set是一个接口,所以不能做new Set()。 (2) 因为大多数Set 实现(包括HashSetTreeSet)都有确定的顺序,它们返回它们的元素,所以虽然数字是随机的,但它们的顺序不是。
【解决方案5】:

你可以简单地做这样的事情而不使用任何Set 或列表:

do{

   //your code 
     Random a = new Random();
     int testa = a.nextInt(9 - 1) + 1;
     Random b = new Random();
     int testb = b.nextInt(9 - 1) + 1;
     Random c = new Random();
     int testc = c.nextInt(9 - 1) + 1;

}
while(testa == testb || testb == testc || testa == testc);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2014-08-10
  • 1970-01-01
相关资源
最近更新 更多