2017-05-04 67 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()));; 
相關問題