2017-05-04 3 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

私は投(1〜6)の値を格納するHashMapを使うだけでなく、あなたがその値を得た回数(それぞれに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ループはハッシュマップのキー1〜6を初期化します。

for-loopは、X個のダイススローを計算し、それらをハッシュマップに追加します。

for-loopは、ハッシュマップの値を繰り返し処理し、結果を出力します。

出力:

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

EDIT:あなたは平均して、次の操作を行うことができ、中央値を取得したい場合は

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]); 

平均値を合計するプロセスは単純です金額で割る。しかし、ハッシュマップの中央値は少し難解です。ここでのより良い選択は、ArrayまたはArrayListを使用して異なる値を格納し、それらをソートし、最後に中間要素(インデックス2または3のいずれか)を選択することです。

このケースでは、サイズを知っているので、私はアレイを選択しました。

EDIT:あなたの最後のリクエストについて

中央値は、私は単にリストに配列を変換し、既知の値でindexOfメソッドを使用するように対応してサイコロを取得するには:

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

平均のサイコロの値を得るのはもう少し複雑です(この数はダイの1つで表されないためです)。配列内の最も近い値を見つけるために平均値を使用し、その値のインデックスを出力する必要があります。ストリームと

+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)); 
} 

また、乱数のためのあなたの現在のアルゴリズムが間違っている、あなたは1 - 6(包括的)の間の乱数を発生器にRandomクラスを使用する必要があります。

+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()));; 
関連する問題