"Math.random() " czy faktycznie z niego taki random ?

"Math.random() " czy faktycznie z niego taki random ?
O6
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:59
0

Witam mam pytanie :

Na potrzeby programu potrzebuję zasymulować rzut monetą zakładając że prawdopodobieństwo na wystąpienie każdego z wyniku wynosi 1/2.
Wydało mi się to banalne i użyłem takiej składni

Kopiuj
int x=(int)(Math.random()*2);
boolean flipCoin=(x==0)? (true):(false);

Podczas symulacji częściej otrzymywałem wynik 0 niż 1 . Czy taka składnia daje mi faktycznie 50% szans na wystąpienie konkretnego wyniku ?

lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Postów:4944
3

Skoro Konwertujesz do integera liczbę z zakresu: [0.0, 1.0) (mniejsze od jeden), to nie dziwne, że Masz więcej zer:). Z dokumentacji:

Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0

Użyj Random.nextInt(int bound).
https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt-int-


C6
Bez przesady, konwertuje przecież liczbę 2*rand, a ta jest z przedziału [0, 2)
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6694
5
okon66113 napisał(a):

Czy taka składnia daje mi faktycznie 50% szans na wystąpienie konkretnego wyniku ?

Jak już wspomniał @lion137, to nie daje.
Ale poza tym losowość rzutu monetą też nie daje konkretnych wyników. Możesz rzucić 10 razy monetą i mieć 9 razy reszkę :]


🕹️⌨️🖥️🖱️🎮
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Poznań
  • Postów:8806
9

A ile tych losowań zrobiłeś? Tak naprawdę dopiero przy dużej ilości (idącej w dziesiątki tysięcy losowań) możemy mówić o w miarę równomiernym rozkładzie.

Jest sobota, mam trochę więcej wolnego czasu z rana, więc na szybko zrobiłem symulację proporcji wyników w zależności od ilości losowań. Jak widać na załączonych poniżej obrazkach (wykonałem kilka prób), dopiero w okolicy 10k losowań wyniki są w miarę równomiernie rozłożone.

screenshot-20200208082958.png

screenshot-20200208083104.png

screenshot-20200208083128.png

screenshot-20200208083237.png


P.S. Java nie jest moją technologią, więc swoją drogą - mógłby się wypowiedzieć ktoś, kto się zna na tym języku, czy podana w pierwszym poście metoda losowania jest prawidłowa.
Jak koledzy napisali powyżej - podana metoda jednak nie była wolna od błędu ;)


edytowany 3x, ostatnio: cerrato
vpiotr
Jakaś dziwna ikonka w tym Swingu, FPC JVM?
cerrato
To było pisane w assemblerze, ale ikonkę zmieniłem żeby zmylić wroga ;)
vpiotr
Acha... :D
cerrato
Ale patent z FPC JVM mi się podoba. Zawsze mogę się chwalić, że znam kolejną technologię :D
YA
  • Rejestracja:około 10 lat
  • Ostatnio:4 minuty
  • Postów:2372
3
cerrato napisał(a):

A ile tych losowań zrobiłeś? Tak naprawdę dopiero przy dużej ilości (idącej w dziesiątki tysięcy losowań) możemy mówić o w miarę równomiernym rozkładzie.

Słusznie prawisz. Dodam, że duża ilość losowań sprawia, że różnica między częstością, a prawdopodobieństwem staje się malutka. W literaturze fachowej można szukać pod hasłem "prawo wielkich liczb Bernoulliego".

vpiotr
Malutka roznica to inaczej rozniczka, pelno o tym w sieci.
YA
Różniczka zwana jest też wyniczkiem odejmowanka :-)
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 9 godzin
7

Prawdziwego randoma to trzeba sobie samemu zrobić:

Kopiuj
public class TrueRandom {
    private boolean next = Math.random() >= 0.5;

    public boolean nextBoolean() {
        return (next ^= true);
    }

    public static void main(String[] args) {
        TrueRandom random = new TrueRandom();
        int orzełki = 0;
        int reszki = 0;
        for (int i = 0; i < 100; i++) {
            if (random.nextBoolean()) {
                orzełki++;
            } else {
                reszki++;
            }
        }
        System.out.println("Orzełki: " + orzełki);
        System.out.println("Reszki: " + reszki);
    }
}

Wynik:

Kopiuj
Orzełki: 50
Reszki: 50

Ideał.

PS:

Kopiuj
boolean flipCoin=(x==0)? (true):(false);

Ciekawy kod, ale mam pomysł na ulepszenie:

Kopiuj
boolean flipCoin=(x==0)? (x==0):(x==0);

Teraz jest znacznie lepiej.

/s


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
Shalom
Czemu dla pewności nie ((x==0) == true)? ;)
Wibowit
Podejmuję wyzwanie: (x==0)==(x==0)?(x==0):(x==0) :]
W0
Najlepsze jest to, że gdy wiele różnych wątków pyta o pojedyncze wyniki to będzie działać jak random()
O6
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:59
0

Jestem bardzo początkujący i nie rozumiem tylko jednego zapisu w twoim kodzie "(next ^= true)" co to oznacza ???

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 9 godzin
3

XOR w połączeniu z przypisaniem. PS: cały kod to satyra.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
O6
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 4 lata
  • Postów:59
0
Wibowit napisał(a):

XOR w połączeniu z przypisaniem. PS: cały kod to satyra.

Przepraszam ale dalej nie rozumiem .

PerlMonk
Nie gniewam się.
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około godziny
  • Postów:6694
2

@Wibowit: skoro jest początkujący, to lepiej dać mu wędkę, nie rybę.

@okon66113: wpisujesz w google: ^= operator java
I przeglądasz kilka pierwszych wyników.


edit: na dole strony z wynikami ma naprowadzenie na inne frazy wyszukiwania:

screenshot-20200210181956.png


🕹️⌨️🖥️🖱️🎮
edytowany 2x, ostatnio: Spine
Wibowit
Tego ^= w zapytaniu to chyba Gugiel nie łapie, bo nie wpływa na wyniki.
Spine
Ale przynajmniej dojdzie do strony z operatorami :] No i na dole strony z wynikami są precyzyjniejsze frazy do wyszukania, dodałem screena do posta.
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 9 godzin
2

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.