Prawdopodobieństwo wyrzucenia reszki

0

Mój program odczytuje ze strumienia ile razy rzucam monetą , ale chciałbym dodać do programu dodatkowy parametr k - prawdopodobieństwo wyrzucenia reszki. I na tym utknąłem.

public static void main (String[] args) {

     Scanner scan = new Scanner (System.in);

     Random coin;
     coin =  new Random();
    
     int count = 0, heads = 0, tails = 0;
     int number_flips, flip_result;

     System.out.print ("Enter the number of flips: ");
     number_flips = scan.nextInt();

     while (count < number_flips)  {

        flip_result = Math.abs (coin.nextInt()) % 2;
        if (flip_result == 0)
           heads = heads + 1;
        else
           tails = tails + 1;
        count = count + 1;
     }
     System.out.println ("The number of heads is " + heads);
     System.out.println ("The number of tails is " + tails);
   }

Jak operować prawdopodobieństwem wyrzucenia reszki z klawiatury?? (zwiększać je ,czy zmniejszać.)

public static float k;
System.out.print("Podaj k (Prawdopodobieństwo wyrzucenia reszki ): ");
k = input.nextFloat();

niech k będzie tym prawdopodobieństwem.

dodanie znacznika <code class="java"> - @furious programming

1

Jeżeli prawdopodobieństwo jest wyrażone w procentach(najlepiej unsigned int). Losujesz liczbę 0-99, jeżeli wylosowana liczba jest mniejsza od prawdopodobieństwa to znaczy że wyrzucono "reszkę".
Wczytujesz jak normalną liczbę z przedziału 0-100

Edit. Nie upewniłem się co zwraca Random w javie, opcja niżej wygląda lepiej...

2
double probability;
System.out.println("Podaj k (Prawdopodobieństwo wyrzucenia reszki ): ");
probability = input.nextDouble();
if (Math.random() < probability)
	System.out.println("Wyrzucono reszkę");
else
	System.out.println("Wyrzucono orła");
0

Zmodyfikowałem kod i wyszło takie coś, i wydaje mi się że chodzi

 
public static void main(String [] args) {  
         Scanner in;  
         in = new Scanner(System.in);  
           
         System.out.println("Ilość rzutów: ");  
         int numberOfFlips = in.nextInt();  
         System.out.println("Prawdopodobieństwo Reszki: ");  
         float k = in.nextFloat();  
         double randomNumber;  

         int c_reszka=0;
         int c_orzel=0;
         for (int counter = 0; counter < numberOfFlips; counter++){                
             randomNumber = Math.random(); 
             
             boolean isTails = randomNumber < k;  
               
             if (isTails)  { 
                 c_reszka++;
                 System.out.print("\nReszka"  );  

             }  
             else { 
                 c_orzel++;
                 System.out.print("\nOrzeł" );  
                  
             }                   
         }
          System.out.println("\n ilość reszek:" + c_reszka);
          System.out.println("\n ilość orłów:" + c_orzel);  
     }
}
0

Nie zadawaj pytań w komentarzach, nie wszyscy je czytają. Jak program ma traktować takie coś:reszka reszka reszka reszka reszka
Trzy serie po trzy reszki, czy żadnej serii z trzema reszkami?

0

Algorytmy losujące, Casino online, poker, blackjack
Co prawda c++ ale może dasz rady zrozumieć.

0

jeżeli output wygalda tak:

reszka
reszka
orzeł
reszka
orzeł
reszka
reszka
reszka

To program powinien wypisać wyrzucono pod rząd dwie reszki. Reszta pod spodem się nie liczy, bo orzeł przerwał passę pod rząd.

dodanie znacznika <code> - @furious programming

1
    public static void main(String [] args) 
    {  
        Scanner in = new Scanner(System.in);  
 
        System.out.println("Ilość rzutów: ");  
        int numberOfFlips = in.nextInt();  
        System.out.println("Prawdopodobieństwo reszki: ");  
        float k = in.nextFloat();  
        double randomNumber;  
 
        int c_reszka=0;
        int c_orzel=0;
        boolean series = true;
        int reszki = 0;
        
        for (int counter = 0; counter < numberOfFlips; ++counter)
        {                
            if (Math.random() < k)  
            { 
                c_reszka++;
                System.out.print("\nReszka");
                if(series)
                {
                    reszki++;
                }                              
 
            }  
            else 
            { 
                c_orzel++;
                System.out.print("\nOrzeł" );
                series = false;                
            }                   
        }
        System.out.println("\n ilość reszek: " + c_reszka);
        System.out.println("ilość orłów: " + c_orzel);
        System.out.println("długość serii: "+reszki);        
    }
0

Ostatnią rzeczą którą bym chciał zrobić, to dołączyć tutaj do programu wątki. Threadsów będzie tyle ile razy rzucam monentą.

        Thread[] threads = new Thread[numberOfFlips];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(new Runnable()  {
                public void run() {
                    
                 //tutaj odpalam tyle watkow ile jest rzutow monet wpisanych na poczatku z klawiatury

                }
            });
            threads[i].start();
        }

Zastanawiam się też czy nie lepiej użyć lepiej newFixedThreadPool

private final ExecutorService pool;
pool = Executors.newFixedThreadPool(numberOfFlips);

for (int i = 0 ; i < numberOfFlips; i++) {
pool.execute(new Handler(myRunnable));

}

Każdy z Threadsów powinien rzucać monetą jeżeli wypadnie orzeł to ten thread kończy swoją działalność, a jeżeli wypadła reszka to rzuca znowu monetą aż do momentu wypadnięcia orła i wtedy kończy działność znowu itd aż każdy będzie thread wyrzuci orła i skończy się wtedy program.

0

Zrobiłem prawie wszystko co chciałem, ale została jedna rzecz. Jak przekazać prawdopodobieństwo ze skanera do mojej funkcji Strona rzut();

return ThreadLocalRandom.current().nextDouble() < 0.6 ? Strony.Orzeł : Strony.Reszka; 

chciałbym dynamicznie zmieniać prawdopodobieństwo więc powinno być takie coś:

return ThreadLocalRandom.current().nextDouble() < p ? Strony.Orzeł : Strony.Reszka; 

i jak przekazać to p do skanera?

final class RzutMoneta {
 public static Float p;
    
  public static void main(String... argv) {
      
      
    System.out.print("Ilość wątków: ");
    int ilość;
    Scanner in = new Scanner(System.in);  
    ilość = in.nextInt();
    System.out.print("Prawdopodobieństwo reszki: ");
    p = in.nextFloat();
    
    ExecutorService watki = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    for (int i = 0; i < ilość; ++i)
      watki.submit(RzutMoneta::run);
    watki.shutdown();
  }

  private static void run() {
    Moneta moneta = new Moneta();
    int count = 0;
    while (moneta.rzut() == Moneta.Strony.Reszka) {
      System.out.println(Thread.currentThread().getName() + ": reszka!");
      ++count;
    }
    System.out.printf("%s: orzel! %d reszka%n", Thread.currentThread().getName(), count);
  }

}

final class  Moneta {
   public static double p;

    Moneta() {
        Moneta.p = RzutMoneta.p;
    }
    
  enum Strony {
    Orzeł, Reszka
  }
  
  Strony rzut() {
      
    //return ThreadLocalRandom.current().nextBoolean() ? Strony.Orzeł : Strony.Reszka;
    return ThreadLocalRandom.current().nextFloat() < p ? Strony.Orzeł : Strony.Reszka;  
  }

}

// edit poprawiony kod działający, jeżeli kiedykolwiek komu się przyda

1 użytkowników online, w tym zalogowanych: 0, gości: 1