2017-05-04 64 views
3

我正在尝试制作一个程序,让用户选择他要掷骰子的次数,然后计算出抛出的骰子的每个值。在程序结束时,用户应该看看他投掷了多少次1,2,3等。这是一个程序,用于查看每个数字是否具有相同的显示机会。Java,对随机数进行计数并将其保存的程序

我在我的代码开始时遇到了问题,因为我不知道如何让计算机扔掷骰子可以说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倍。正如你所看到的,我还没有走过,我只需要知道我如何保存和计算每个掷出的骰子。然后我想我会使用开关和案例来保存它(任何建议也会有帮助)。任何建议或答案都会有所帮助。谢谢。

+3

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – OldProgrammer

回答

3

我会用一个HashMap来存储掷(1至6)值,以及存储的次数,你(一个对每个增量)得到了价值:

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-loop会初始化散列表中的键1到6。

第二个for-loop计算X个掷骰子数并将它们添加到hashmap中。

第三个for-loop循环遍历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 + "."); 

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

+0

谢谢!这工作很好:) – mackanmorre

+0

您是否也知道当我使用此解决方案时,我可以轻松获得中位数和平均值? – mackanmorre

+0

@mackanmorre当然可以!我已经更新了答案:)很高兴我能帮忙! – Adrian

1

您可以使用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(含)生成随机数。

+0

或者只是使用数组看到我们怎么知道他们有多少存储之前...... –

+0

@austinwernli关于这个问题已经有了另一个答案,所以我会坚持这个^^。 –

1

你过了一次又一次写入相同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.RandomnextInt()有一个上限(在你的的情况下,骰子的最大值可以是6,所以使用上限作为7)来生成如上所示的随机数。

0
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] 
    } 
} 
0

版本与流:

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