【问题标题】:Writing a program with random numbers用随机数编写程序
【发布时间】:2013-10-18 01:41:04
【问题描述】:

我必须为我的 CS 入门课程编写一个程序作为一个项目。程序必须

  1. 向用户询问最小值(可以是负数)
  2. 向用户询问最大值(也可能是负数,但必须大于最小值)
  3. 产生 20 个介于用户给出的最小值/最大值之间的随机数和
  4. 产生 20 个随机数的平均值。

我以为我已经完成了程序,但是当我执行程序时,数字从来都不是随机的,所有 20 个数字都与我输入 emacs 的最大值相同。当然,在这种情况下,平均值也与最大值相同。到目前为止,这是我的程序...

import java.util.Scanner;
import java.util.Random;

public class CS_ProjectOne
{
    public static void main(String[] args)
    {
    int minimum_integer;
    int maximum_integer;
    int rn1;
    int rn2;
    int rn3;
    int rn4;
    int rn5;
    int rn6;
    int rn7;
    int rn8;
    int rn9;
    int rn10;
    int rn11;
    int rn12;
    int rn13;
    int rn14;
    int rn15;
    int rn16;
    int rn17;
    int rn18;
    int rn19;
    int rn20;
    double total;
    double average;
    Scanner keeper;
    Scanner keeper2;
    Random gen;
    gen = new Random();

    keeper = new Scanner(System.in);
    System.out.print("Please enter an integer for the MINIMUM value: ");
    minimum_integer = keeper.nextInt();

    keeper2 = new Scanner(System.in);
    System.out.print("Please enter an integer for the MAXIMUM value: ");
    maximum_integer = keeper2.nextInt();

    rn1 = gen.nextInt();
    rn1 = rn1 % minimum_integer + maximum_integer;
    rn2 = gen.nextInt();
    rn2 = rn2 % minimum_integer + maximum_integer;
    rn3 = gen.nextInt();
    rn3 = rn3 % minimum_integer + maximum_integer;
    rn4 = gen.nextInt();
    rn4 = rn4 % minimum_integer + maximum_integer;
    rn5 = gen.nextInt();
    rn5 = rn5 % minimum_integer + maximum_integer;
    rn6 = gen.nextInt();
    rn6 = rn6 % minimum_integer + maximum_integer;
    rn7 = gen.nextInt();
    rn7 = rn7 % minimum_integer + maximum_integer;
    rn8 = gen.nextInt();
    rn8 = rn8 % minimum_integer + maximum_integer;
    rn9 = gen.nextInt();
    rn9 = rn9 % minimum_integer + maximum_integer;
    rn10 = gen.nextInt();
    rn10 = rn10 % minimum_integer + maximum_integer;
    rn11 = gen.nextInt();
    rn11 = rn11 % minimum_integer + maximum_integer;
    rn12 = gen.nextInt();
    rn12 = rn12 % minimum_integer + maximum_integer;
    rn13 = gen.nextInt();
    rn13 = rn13 % minimum_integer + maximum_integer;
    rn14 = gen.nextInt();
    rn14 = rn14 % minimum_integer + maximum_integer;
    rn15 = gen.nextInt();
    rn15 = rn15 % minimum_integer + maximum_integer;
    rn16 = gen.nextInt();
    rn16 = rn16 % minimum_integer + maximum_integer;
    rn17 = gen.nextInt();
    rn17 = rn17 % minimum_integer + maximum_integer;
    rn18 = gen.nextInt();
    rn18 = rn18 % minimum_integer + maximum_integer;
    rn19 = gen.nextInt();
    rn19 = rn19 % minimum_integer + maximum_integer;
    rn20 = gen.nextInt();
    rn20 = rn20 % minimum_integer + maximum_integer;

    System.out.println("Your random numbers are: " + rn1 + ", " + rn2 + ", " + rn3 + ", " + rn4 + ", " + rn5 + ", " + rn6 + ", " + rn7 + ", " + rn8 + ", " + rn9 + ", " + rn10 + ", " + rn11 + ", " + rn12 + ", " + rn13 + ", " + rn14 + ", " + rn15 + ", " + rn16 + ", " + rn17 + ", " + rn18 + ", " + rn19 + ", " + rn20 + ".");

    total = rn1 + rn2 + rn3 + rn4 + rn5 + rn6 + rn7 + rn8 + rn9 + rn10 + rn11 + rn12 + rn13 + rn14 + rn15 + rn16 + rn17 + rn18 + rn19 + rn20;
    average = total / 20;

    System.out.print("The average is " + average);
    }
}

任何人都可以提供帮助并引导我朝着正确的方向前进吗?我确定有些事情我做得不对(或很多事情)我只是不知道那到底是什么。

这是我试图让它工作的简短版本......

import java.util.Random;
import java.util.Scanner;

public class p1
{
    public static void main(String[] args)
    {
    Random gen;
    gen = new Random();
    Scanner keeper;
    int range, user_min, user_max, num1, num2, num3, total;
    double average;

    keeper = new Scanner(System.in);
    System.out.print("Please enter a maximum integer value: ");
        user_max = keeper.nextInt();

        keeper = new Scanner(System.in);
    System.out.print("Please enter a minimum integer value: ");
    user_min = keeper.nextInt();

    range = user_max - user_min + 1;

    num1 = gen.nextInt() % range + user_min;
    num2 = gen.nextInt() % range + user_min;
    num3 = gen.nextInt() % range + user_min;

    System.out.print("The random numbers computed are " + num1 + ", " + num2 + ", " + num3 + ", ");
    }
}

为什么这不能处理底片?而且我的值仍然不在指定范围内?帮忙?

【问题讨论】:

    标签: java random


    【解决方案1】:

    一些提示/提示:

    1. 对 20 个数字使用数组。那么当你发现错误时,你只需要纠正一次而不是 20 次。

    2. 随机数生成器有种子。确保每次提供不同的种子,否则随机数生成器将始终生成相同的随机数集。

    3. MIN 和 MAX 之间可以有多少个值?例如,3 到 7 之间可以有多少个不同的值? 45和80? 3和1200?找到模式。

    4. 了解为什么您的程序需要 '%' 运算符。通过执行“gen.nextInt() % NUM”可以实现什么?

    【讨论】:

    • 我明白你所说的#3,它是最大-最小。我只是不明白如何在我的代码中进行这项工作。此外,我们还没有检查数组,所以我不确定该怎么做。我试着做 gen.nextInt() % range + min;让我的代码在 range = max - min + 1 处工作;但这也没有用。
    • 我也不知道你说的#2是什么意思?你的意思是我必须有一个 gen1、gen2、gen3 等?
    • @Tim gen.nextInt() % range + min,其中 range = max - min + 1 正是您所需要的。做得很好。当您说“那也不起作用”时,究竟是什么不起作用?至于#2,你可以看看:stackoverflow.com/questions/12458383/…
    • 谢谢!我的意思是,当我在执行程序后在终端中输入最大值和最小值时,例如 5 和 3,我会得到低于 3 的值,例如 1 和 2。当我输入最大值为 6 和最小值为 1 时,我像以前一样得到所有 6。
    • 这是我的部分代码目前的样子:keeper = new Scanner(System.in); System.out.print("请输入最大整数值:"); user_max = keeper.nextInt(); keeper = new Scanner(System.in); System.out.print("请输入最小整数值:"); user_min = keeper.nextInt();范围 = user_max - user_min + 1; num1 = gen.nextInt() % user_min + 范围; num2 = gen.nextInt() % user_min + range; num3 = gen.nextInt() % user_min + range; System.out.print("计算出的随机数为 " + num1 + " ," + num2 + " ," + num3 + " ,"); } }
    【解决方案2】:

    随机列表示例:
    (为了便于演示,使用 Python 而不是 Java。)

    1   #!/usr/bin/env python
    2   def spawn(user_min, user_max, rounds):
    3     import random 
    4     sum = 0
    5     user_range = user_max - user_min + 1  
    6     for i in range(rounds):
    7       result = int((random.random() * user_range)) + user_min
    8       sum = sum + result
    9       print(str(i) + ': ' + str(result))
    10     mean = sum / rounds
    11    print('range: ' + str(user_range))
    12    print('mean: ' + str(mean))
    

    您感兴趣的线路是:

    • 第 5 行:这决定了随机数的分布。
    • 第 7 行: 这会获取范围为[0.0, 1.0) 的随机值;乘以所需的用户范围;然后转换为整数以“砍掉”尾随小数点;然后将结果添加到该范围的最小允许值。

    例如:

    range = (10) - (-5) + 1 = 16
    a_result = (int)(0.14159265359 * 16) + -5 = 3 - 5 = -3
    another_result = (int)(0.71828182845 * 16) + -5 = 11 - 5 = 6
    

    【讨论】:

    • 您的代码永远不会输出 userMaxInt。尝试使用 userMinInt = 0userMaxInt = 1 只获得零。 (这是假设 (int) 计算正实数的下限。如果它对整数进行四舍五入,则所有值都是可能的,但可能性不大。例如,如果 userMinInt = 0 和 userMaxInt = 2 那么你得到 1 的概率为 1/2。)
    • @YuvalFilmus Doh。你是对的。这就是为什么我更喜欢在 python 中发布代码 sn-ps 的原因。范围方程偏离了 1。我会更新帖子。
    • 那么我应该做的是取最大整数并减去最小整数?我假设我会为在定义的范围内计算随机值创建一个新行?
    • 它会像... range = maximum_integer - minimum_integer + 1; 然后一行代码将范围添加到 minimum_integer?我不确定我会怎么做。
    • @Tim 为了通用,大多数编程语言都有一个函数,可以提供任意精度的随机数interval[0, 1)。这样,应用程序可以获取数字并乘以所需范围以获得所需范围的随机数。由于[0, 1) * range 仅提供正值并且将从0 开始,您需要添加user_min 以将范围“移动”到位。
    【解决方案3】:

    线

    rn1 = rn1 % minimum_integer + maximum_integer;
    

    错了。例如,考虑生成 1 到 6 范围内的数字。然后您正在计算

    rn1 = rn1 % 1 + 6;
    

    现在,rn1 % 1 总是等于 0,所以你总是得到 6。你应该使用不同的公式。

    【讨论】:

    • 我还是不知所措。我该如何做到这一点,以便对于用户为最大值和最小值输入的任何数字,随机数将在用户声明的这些值之间计算?我明白你在说什么,但用户并不总是会输入 1 和 6 作为值。
    • 在 min = 1, max = 6 的情况下,您的公式已经不起作用。您应该找到一个可以起作用的不同公式。您可以从一个适用于 min = 1 和 max = 6 的公式开始,然后尝试推广它。
    • [T]用户并不总是会输入 1 和 6 - 你的程序应该适用于 min 的 all最大。特别是,它应该适用于值 1 和 6。在这种情况下,它已经失败了。为了使其正常工作,它应该首先在这种特殊情况下工作。你说得对,让它在这种特殊情况下工作是不够的,但它是让它在一般情况下工作的先决条件。
    • 我发现它不适用于任何数字。我完全不知道该怎么做才能让它工作......?
    • 通过仔细查看我的笔记,我意识到我的代码中有一个(重复的)部分是相反的。部分:rn1 = rn1 % minimum_integer + maximum_integer;应为:rn1 = rn1 % maximum_integer + minimum_integer;正确的?那么 rn1 = rn1 % 1 + 6;现在将读取 rn1 = rn1 % 6 + 1;
    【解决方案4】:

    这就是我想出来的..

    import java.util.*;
    class RandNegToPos {
        public static void main(String[] args) 
        {
    
                Scanner scan = new Scanner(System.in);
                int array[]=new int[20];
                System.out.println("What is the minimum? ");
                int min = scan.nextInt();
    
                System.out.println("What is the maximum? ");
                int max = scan.nextInt();
    
                if (max < min)
                    System.out.println("Sorry the maximum is less than the miniumum.");
    
                else{
    
                int rnd = (int) (min + Math.random() * ((max) - min));   
                for (int i=0; i < 20 ; i++)
                {
                    rnd = (int) (min + Math.random() * ((max) - min));
                    array[i] = rnd;
                }
                int sum=0;
                for (int t : array)
                    sum += t;
                System.out.println("Your randoms are:");
                System.out.println(Arrays.toString(array));
                System.out.println("The average is: " + (sum/20) );
                }
       }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多