【问题标题】:Error using "for" to generate 100 random numbers in java eclipse and compare them to the user value在 java eclipse 中使用“for”生成 100 个随机数并将它们与用户值进行比较时出错
【发布时间】:2021-06-17 07:53:15
【问题描述】:

我是 Java 新手,我遇到的问题是我总是得到 0 个大于用户值的随机数,并且每次运行程序时我应该得到不同数量的大于值的随机数

package chapterfinal;
import java.util.Scanner;

public class finalf {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner (System.in);
    int greaterOrequal = 0;
    int count = 0;
    final int finalcount = 100;
    System.out.println("Enter a value between 30 and 70: ");
    int value = input.nextInt();
    
    while (value > 70 || value < 30) {
        System.out.println("Please try to enter a value between 30 and 70: ");
        value = input.nextInt();
        
    }
    
    for (count = 0; count < finalcount; count++) {
        int random = (int) Math.random() * 100;
        if (random >= value)
                greaterOrequal++;
    }
        System.out.println("There are " + greaterOrequal + " random numbers greater than " + value);
            
} }

“while”代码是提示用户重新输入一个介于 30-70 之间的值,以防用户输入超出该范围的内容。

“for”代码是生成 100 个随机数,并分析有多少个大于用户输入的值。

最后只打印有多少随机数大于该值的结果并打印用户输入的值

我知道是一个非常简单的代码,我找不到它有什么问题!

这是我得到的结果:

Enter a value between 30 and 70: 
80
Please try to enter a value between 30 and 70: 
50
There are 0 random numbers greater than 50

它应该是这样的:

Enter a value between 30 and 70:
25
Please try to enter a value between 30 and 70:
50
There are 51 random numbers greater than 50

每次我运行程序时,我应该得到比用户值更大的不同数量的随机数。

希望大家能帮帮我

请提供任何帮助!

【问题讨论】:

    标签: java eclipse for-loop random while-loop


    【解决方案1】:

    int random = (int) Math.random() * 100;

    这并不像你想象的那样解析。

    那会:

    [A] 生成一个介于 0 和 1 之间的数字。

    [B] 将该数字转换为 int,因此,现在它始终为 0。

    [C] 然后将其乘以 100。仍然是 0。

    换句话说,解析为 ((int) Math.random()) * 100。

    简单的修复方法是 (int)(Math.random() * 100),但请注意,这不是获取 0 到 99 之间随机数的正确方法

    鸽子洞原则适用:计算机并不神奇;您的程序实际上可以生成 X 个介于 0 和 1 之间的唯一数字。 X 很高,但不是无限的。 (大约是 2^53)。

    如果 X 不能被 100 整除(剧透:它不能),那么 0 到 100 之间的数字会比其他数字更频繁地被选中:它不均匀。

    您不太可能注意到(效果会很小),但这解释了为什么公式从根本上被破坏了。

    正确的做法如下:

    Random r = new Random(); // do this only once.
    
    int x = r.nextInt(100); // x can be 0, 99, or anything in between.
    

    这也是更简洁的代码,因为没有公式,更难弄乱括号。

    【讨论】:

    • 哇,它成功了!非常感谢您向我解释,我很感激
    • @Supertierno 请注意,至少可以使用控制台日志记录(通过System.out.println)或 IDE 的调试器跟踪/隔离此类问题。通过查看正在比较的实际值,并将它们分解为临时变量,您可以找出为什么某些东西失败了,即使解决方案不是立即显而易见。
    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 2017-06-06
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多