【问题标题】:Java, program that counts random number and saves itJava,计算随机数并保存的程序
【发布时间】:2017-10-03 04:48:47
【问题描述】:

我正在尝试制作一个程序,让用户选择他想要掷骰子的次数,然后应该计算所掷骰子的每个值。在程序结束时,用户应该看到他投了多少次 1、2、3 等。这是一个查看每个数字是否有相同机会被显示的程序。

我在代码开始时遇到了问题,因为我不知道如何让计算机掷骰子让我们说 1000 次,然后保存这些掷骰子的每个值。这是我目前所拥有的:

import java.util.Scanner;

public class Uppgift4_5 
{

public static void main(String[] args) 
{
    Scanner inputReader = new Scanner (System.in);
    System.out.println("How many times do you want to throw the dice:");
    int amount = inputReader.nextInt();

    int [] dice = { 1, 2, 3, 4, 5, 6 };
    int random = 0;

    for (int i = 0; i < amount; i++)
    {
        random = (int) (Math.random () + 1);
    }





}

}

我面临的问题是它只保存一个随机数,然后将该数字循环 6 次。 如您所见,我还没有走多远,我只需要知道如何保存和计算每个掷出的骰子。然后我想我将使用开关和外壳以某种方式保存它(那里的任何建议也会有所帮助)。任何建议或答案都会有所帮助。谢谢。

【问题讨论】:

标签: java arrays random count


【解决方案1】:

我会使用 HashMap 来存储 throw 的值(1 到 6),以及存储你获得该值的次数(每次递增 1):

public static void main(String[] args) {
    Scanner inputReader = new Scanner(System.in);
    System.out.println("How many times do you want to throw the dice:");
    int amount = inputReader.nextInt();

    Map<Integer, Integer> rolls = new HashMap<>();

    for (int i = 1; i < 7; i++) {
        rolls.put(i, 0);
    }

    for (int i = 0; i < amount; i++) {
        int value = (int) (Math.random() * 6 + 1);
        rolls.put(value, rolls.get(value) + 1);
    }

    for (Map.Entry<Integer, Integer> entry : rolls.entrySet()) {
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }

}

第一个 for 循环初始化 hashmap 中的键 1 到 6。

第二个 for 循环计算 X 次掷骰子并将它们添加到哈希图中。

第三个 for 循环遍历 hashmap 中的值并打印出结果。

输出:

How many times do you want to throw the dice:
500
1: 92
2: 88
3: 72
4: 78
5: 81
6: 89

编辑:如果您想获得平均值和中位数,您可以执行以下操作:

double average = 0;
int[] storedSums = new int[6];

int i = 0;
for (Map.Entry<Integer, Integer> entry : rolls.entrySet()) {
    int sum = entry.getValue();
    average += sum;
    storedSums[i++] = sum;
    System.out.println(entry.getKey() + ": " + sum);
}

Arrays.sort(storedSums);

System.out.println("Average: " + (average / 6));
System.out.println("Median: " + storedSums[2]);

平均值只是将值相加并除以数量的过程。然而,带有 hashmap 的中位数有点棘手。这里更好的选择是使用 Array 或 ArrayList 来存储不同的值,然后对它们进行排序,最后选择中间元素(索引 2 或 3)。

在这种情况下我选择了一个数组,因为我们知道它的大小。

编辑:关于您的最后一个请求:

为了得到中值对应的骰子,我简单地将数组转换为列表,并使用已知值的indexOf方法:

int medianDice = Arrays.asList(storedSums).indexOf(storedSums[2]);
System.out.println("Median: " + storedSums[2] + ", which belongs to dice: " + medianDice + ".");

获取骰子的平均值有点复杂(因为这个数字不是由其中一个骰子表示的)。您必须使用平均值来找到数组中最接近的值,然后输出该值的索引。

【讨论】:

  • 您是否还知道我在使用此解决方案时如何轻松获得中位数和平均值?
  • @mackanmorre 当然可以!我已经更新了答案 :) 很高兴我能帮上忙!
  • 谢谢!不过似乎有一个问题。中位数和平均值作为值 1 返回?
  • @mackanmorre,(假设)10 次投掷的平均值和中位数很可能是一次。如果您想要一个更“正确”的值,您可以将平均值设置为双精度数而不是整数。掷的骰子越多,平均值和中位数的值就越高。
  • 如果你还有时间,我遇到的一个问题是,当我喜欢 500 次投掷时,平均值和中位数的值为 80。相反,我希望平均值和中位数的范围为1-6.
【解决方案2】:

你一遍又一遍地写相同的randomint值,所以使用int的数组来存储值,如下所示:

int[] random = new int[amount];//declare an array
Random randomNumber =  new Random();
for (int i = 0; i < amount; i++) {
    random[i] = randomNumber.nextInt(7);
}

另外,使用 java.util.Random nextInt() 和上限(在您的情况下,骰子的最大值可以是 6,所以使用上限为 7)来生成如上所示的随机数。

【讨论】:

    【解决方案3】:

    您可以使用ArrayList 来存储随机数,然后在需要时对其进行处理。

    List<Integer> listOfNumbers = new ArrayList<>(amount);
    Random generator = new Random();
    for (int i = 0; i < amount; i++)
    {
         listOfNumbers.add(generator.nextInt(7));
    }
    

    另外,您当前的随机数算法不正确,您应该使用Random 类生成1 - 6(含)之间的随机数。

    【讨论】:

    • @austinwernli 已经有另一个答案,所以我会坚持这个^^。
    【解决方案4】:
    import java.util.Scanner;
    import java.util.Random;
    
    public static void main(String[] args){
        Scanner inputReader = new Scanner(System.in);
        System.out.println("How many times do you want to roll the dice:");
        int num_rolls = inputReader.nextInt();
        int NUM_SIDES_ON_DICE = 6;
        int[] results = new int[NUM_SIDES_ON_DICE]
        Random rand = new Random();
        for (int i = 0; i < num_rolls; i++) {
            results[rand.nextInt(NUM_SIDES_ON_DICE)] += 1
        }
        for (int i = 0; i < dice.length; i++) {
            System.out.println("Number of " + (i+1) + "'s thrown: " + results[i]
        }
    }
    

    【讨论】:

      【解决方案5】:

      带流的版本:

              new Random()
              .ints(amount, 1, 7).boxed()
              .collect(Collectors.groupingBy(s -> s))
              .forEach((k, v) -> System.out.println(k + ": "+v.size()));;
      

      【讨论】:

        猜你喜欢
        • 2016-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多