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

È stato utile?

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

}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top