【问题标题】:Generate a random number larger or smaller than the previous random number生成一个大于或小于前一个随机数的随机数
【发布时间】:2014-12-27 05:52:04
【问题描述】:

我正在尝试生成一个大于和小于前一个随机数的随机数,但不知道如何。

到目前为止我有这个:

number = (int)( max * Math.random() ) + min;
guess = (int)( max * Math.random() ) + min;
if (guess<number)
   {
      guess = (int)( max * Math.random() ) + min;
      System.out.println(guess);
    }
else if (guess>number)
 {
      guess = (int)( max * Math.random() ) + min;
     System.out.println(guess);
 }

更新:如何确保它不会生成已经生成的随机数?计算机有 10 次尝试猜测生成的数字,但我想让它变得合乎逻辑,因为它不会生成它已经知道是错误的数字。

【问题讨论】:

  • 如何添加一个循环,直到获得更高(或更小)的数字?当然,还有更高效的方法,但这是我能想到的最简单的方法
  • 哦,这样行不行!所以,只是循环生成随机数,直到我得到一个更高的数字? @MatiCicero
  • 只是一种方法
  • 我会试试的,不过应该可以。谢谢! @MatiCicero
  • 另一种方法是在先前数字和上限之间生成新数字。

标签: java math random int inequality


【解决方案1】:

排序随机数列表怎么样...

public static void method2() throws Exception {
    Random rng = new SecureRandom();
    Set<Integer> numbers = new HashSet<>();
    while (numbers.size() < 3) {
        // number only added if not already present in Set, set values are unique
        numbers.add(rng.nextInt(MAX));
    }
    List<Integer> numberList = new ArrayList<>(numbers);
    Collections.sort(numberList);
    // lower random at index 0, mid at index 1
    // you can guess where the other one is hiding 
    System.out.println(numberList);
}

我先把它们放在一个集合中,以确保没有重复。当然,如果 MAX 的值为 1,这可能需要一段时间。

这种方法的一个优点是数字应该很好地分布在 0 到 MAX 之间。如果您直接使用范围,那么您必须处理上限和下限。

当然,只要值的最大数量(显着)高于列表中的数字数量(在本例中仅为 3),这种方法也可以很容易地扩展到在范围内工作。

【讨论】:

  • 对于我的特定程序,我认为这不是我要寻找的,但是我知道您来自哪里。但是有没有更基本的方法来制作列表,并确保不产生重复?
  • 当然,您可以创建一个列表,并在添加数字时检查它们是否唯一。对于一个小列表来说,这当然很好。当然,使用TreeSet 会更好,但我不想完全吓到你。
  • 我绝对不是高级 Java 程序员,所以有没有一种基本的方法来检查受骗并确保猜测不等于受骗
  • 呃,是的,有这种袋子之类的东西,可能不包含骗子。它被称为集合。集合是处理 OOP 和 Java 的现代方式。
  • 如果需要更多帮助,我会查找并回复。谢谢!
【解决方案2】:

如果计算机播放器收到的信息表明其猜测值太低或太高(或正确),您需要跟踪正确值的可能值范围。最初,这是整个范围,min..max。一旦你猜到一个不正确的值,你就移动min 或max:

if (guess<number)
{
   min = guess + 1; // Don't guess any more number <= guess
}
else if (guess>number)
{
   max = guess - 1; // Don't guess any more number >= guess
}
else
{
   // I WIN!!
}

现在您始终可以在min 和max 之间获得正确的猜测范围。

现在,您在该范围内生成随机数的逻辑似乎有点不对劲。 This answer @Solver 的答案中链接的问题具有正确的逻辑:

guess = (int)( (max - min) * Math.random() + 1) + min;

【讨论】:

    【解决方案3】:

    您可以在获取随机数时指定最小值和最大值,如下所示:How do I generate random integers within a specific range in Java?

    【讨论】:

    • 是的,但是对于这个问题,您必须提醒自己,您有必须验证的上限和下限。
    【解决方案4】:

    这将始终返回如下数字:less

      number = (max * Math.random()) + min;
      less = (number * Math.random()) + min;
      more = ((max - number) * Math.random()) + number;
    

    编辑: 误解了这个问题。

    【讨论】:

    • 因为在生成随机数之前设置了一个最大值,而这段代码允许随机数超过该值。
    • 哦,我有一个新的答案。请重新考虑。
    • 如果:number = min,例如0.
    • 嗯,less 也会是 0,因此不是 less。
    猜你喜欢
    • 2022-11-21
    • 2023-01-03
    • 2020-06-29
    • 2013-01-06
    • 1970-01-01
    • 2018-04-21
    • 2011-09-18
    • 2017-09-24
    • 2018-04-03
    相关资源
    最近更新 更多