Come lanciando una moneta e visualizzare code e teste contando?
-
21-12-2019 - |
Domanda
Sono molto principiante su Java, sta ancora diventando passione. Mi è stato dato questo esercizio: "Scrivi un programma simulatore che lancia una moneta: mille migliaia di volte quindi stampa quante volte ottieni le code e quante volte ottieni teste" Questo è quello che ho provato a fare finora.
import java.util.Random;
import java.util.regex.Pattern;
public class coin {
public static void main( String [] args ) {
Random r = new Random();
Pattern tail = Pattern.compile("Tail+");
Pattern head = Pattern.compile("Head+");
String flips = "";
for (int i = 0; i < 1000; i++) {
flips += r.nextInt(100) % 2 == 0 ? "Head" : "Tail";
}
String[] heads = head.split( flips );
String[] tails = tail.split( flips );
//Display
System.out.println("Times head was flipped:" + heads.length);
System.out.println("Times tail was flipped:" + tails.length);
}
}
.
Il programma sembra funzionare, ma mi sta dando sempre una quantità quasi coppia di teste e code, che il totale supera 1000, almeno per 1 o più. Per favore, qualcuno ha una soluzione di questo?Dove sono sbagliato? Grazie
Soluzione
Una moneta ha due lati, quindi non vedo davvero il motivo per cui chiedere al generatore casuale di generare un numero compreso tra 0 e 100 (esclusivo).Tra 0 e 2 (esclusivo) sarebbe molto più logico.
Inoltre, ti viene chiesto di contare.Aggiunta di stringhe e poi divisione per ottenere il valore finale è un modo piuttosto complesso e inefficiente per contare.Dovresti usare invece un numero intero.Ogni volta che ottieni un 1 dal tuo casuale, incrementa un contatore.Alla fine, è stato restituito il numero di volte 1 e il numero di 0 è quindi 1000 - questo numero.
Random r = new Random();
int heads = 0;
for (int i = 0; i < 1000; i++) {
int side = random.nextInt(2);
if (side == 1) {
heads++;
}
}
System.out.println("Times head was flipped:" + heads);
System.out.println("Times tail was flipped:" + (1000 - heads));
.
Potrebbe anche essere semplificato per il follwoing (anche se questa semplificazione rende il codice un po 'più difficile da capire):
Random r = new Random();
int heads = 0;
for (int i = 0; i < 1000; i++) {
heads += random.nextInt(2);
}
System.out.println("Times head was flipped:" + heads);
System.out.println("Times tail was flipped:" + (1000 - heads));
. Altri suggerimenti
Piuttosto che aggiungere il risultato in una stringa e quindi dividere la stringa e contando l'evento di "testa" / "coda" puoi semplicemente tenere traccia del conteggio in variabili separate:
int headCount = 0;
int tailCount = 0;
for (int i = 0; i < 1000; i++) {
if(r.nextInt(100) %2 == 0)
{
headCount++;
}
else
{
tailCount ++;
}
System.out.println("Times head was flipped:" + headsCount);
System.out.println("Times tail was flipped:" + tailCount);
}
.