Losowanie liczb z udziałem użytkownika

Losowanie liczb z udziałem użytkownika
AN
  • Rejestracja: dni
  • Ostatnio: dni
0

Chciałbym się upewnić, czy faktycznie to będą prawdziwie losowe liczby, a jak nie, to dlaczego? Jakiś czas temu rzuciłem taki pomysł na forum elektronicznym w kontekście jakiegoś komputerka 8-bitowego i został podniesiony zarzut, że to nie jest dobry pomysł na liczby losowe, ale bez uzasadnienia (na pewno nie chodzi o udział użytkownika ani ryzyko konieczności wielokrotnego naciskania klawisza, chodziło o samą jakość losowania).

Załóżmy, że chcemy losować liczby od 1 do 6 (rzut kostką). O ile na PC, czy nawet Raspberry PI, czy smartfonie, to żaden problem, to na prostych urządzeniach (mikrokontrolery, systemy wbudowane) to już może być problem. Na PC jest pełno algorytmów pseudolosowych, które generują ciągi udające losowe w stopniu wystarczającym w 99% projektów.

Oczywiście, nic nie stoi na przeszkodzie, żeby na PC zastosować opisany niżej pomysł.

Pomysły są dwa, oba mają następujące wspólne cechy:

  1. Program czeka na naciśnięcie klawisza, moment naciśnięcia klawisza decyduje o wylosowanej liczbie.
  2. Przy naciśnięciu klawisza możliwe jest trafienie poza zakresem, program sygnalizuje o tym fakcie i potrzebne jest powtórne przeprowadzenie losowania, czyli kolejne naciśnięcie klawisza. Teoretycznie takich powtórek może być nieskończenie wiele, ale prawdopodobieństwo konieczności jest mniejsze niż 50%.
  3. Maksymalny zakres losowania to od 0 do 9, czyli 10 różnych możliwości.
  4. Liczba losowanych liczb to najwyżej 5.

Pomysł 1 - system zawierający zegar czasu rzeczywistego z możliwością odczytu setnych sekundy:

Kopiuj
Number = -1;
while (Number < 0)
{
    CzekajNaNacisniecieKlawisza;
    T = BiezacaGodzina;
    Digit = PobierzCyfreZSetnejSekundyGodziny(T);
    if ((Digit >= 1) && (Dogot <= 6))
    {
        Number = Digit;
    }
}
// Poprawnie wylosowana cyfra to od 1 do 6, prawdopodobieństwo poprawnego losowania to 60% (6 poprawnych cyfr na 10 możliwych).

Inspiracja: W drugiej połowie lat 90. XX wieku miałem elektroniczny zegarek ze stoperem, który teoretycznie odmierzał czas z dokładnością do 1/100 sekundy, uruchamianie i zatrzymywanie następowało poprzez wciśnięcie przycisku. W praktyce, czas 1/10 sekundy jest tak krótki, że ręcznie nie da się zmierzyć czasu zdarzenia z dokładnością do 1/100 sekundy. Również, jak się wymyśli jakąś cyfrę, to nigdy nie udało mi się otrzymać tej cyfry na pozycji setnych. Okazuje się, że można powiedzieć, że jak zatrzymam stoper, to cyfra na pozycji 1/100 będzie przypadkowa, szczególnie, gdy nie patrzy się na wyświetlacz ani nie mierzy się czasu jakiegoś zdarzenia.

Pomysł 2 - system, który nie zawiera zegara czasu rzeczywistego:

Kopiuj
Number = -1;
Digit = 0;
while (Number < 0)
{
    if (KlawiszNacisniety)
    {
        if ((Digit >= 1) && (Digit <= 6))
        {
            Number = Digit;
        }
        while (KlawiszNacisniety)
        {
        }
    }
    Digit = Digit + 1;
    if (Digit == 8)
    {
        Digit = 0;
    }
}
// W tym kodzie cyfra może przybrać stan od 0 do 7, skrajne stany nie są ważne (wymuszają ponowne losowanie) po to.
// żeby wyeliminować wpływ zawijania inkrementacji na prawdopodobieństwo trafienia poszczególnych cyfr.
// Poprawnie wylosowana cyfra to od 1 do 6, prawdopodobieństwo poprawnego losowania to 75% (6 poprawnych cyfr na 8 możliwych).

Inspiracja: W latach 90. XX wieku i na początku XXI wieku nieraz brałem udział w zabawie polegającej na wylosowaniu litery i zapisaniu na kartce nazw na tą literę (państwo, miasto, roślina, zwierzę itp). Losowanie przebiega w taki sposób, że jedna osoba wyobraża kolejne litery, a druga osoba mówi "stop", wtedy pierwsza osoba wypowiada wyobrażaną w tym momencie literę. W komputerze, cały alfabet można przejść w ułamku sekundy, a w chwili naciśnięcia klawisza pojawi się litera, która w tym właśnie momencie była w pamięci.

To samo podejście jest w tej grze od miejsca 2:20 do końca nagrania:

Bardzo szybko zmieniają się liczby, liczba przestaje się zmieniać w momencie naciśnięcia przycisku przez gracza.

Inna gra to w momentach 1:38, 2:56, 4:10:

W tej grze, jak na górze jest pokazany rysunek gamepada, to gracz musi nacisnąć przycisk. Łatwo się domyślić, po co to jest (ta konsola nie ma RTC i ma powolny 8-bitowy procesor).

W tym miejscu nie rozważamy realizacji losowania w zakresie większym niż od 0 do 9 ani mniejszym niż od 0 do 5. Chodzi o sam sposób losowania z udziałem użytkownika. Tutaj to użytkownik losuje, a nie komputer jakimś wymyślnym algorytmem.

Czy tak realizowane losowanie da prawdziwie losowe liczby przy założeniu, że jeden cykl (wszystkie możliwe stany) trwa najwyżej 1/10 sekundy?

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9220
4

Przy naciśnięciu klawisza możliwe jest trafienie poza zakresem, program sygnalizuje o tym fakcie i potrzebne jest powtórne przeprowadzenie losowania

Możesz wyjaśnić co autor miał na myśli? Bo ja to bym zrobił w ten sposób, że mamy pętlę, której warunkiem wyjścia jest wciśnięcie klawisza. W pętli jest losowana liczba z określonego zakresu. I po prostu - po losowaniu mamy jakąs wartość. Jeśli user wcisnął klawisz to kończymy pętle i ta wartość jest wynikiem losowania. Jeśli nie wcisnął to znowu losujemy i sprawdzamy, czy klawisz się wcisnął. W jaki sposób tutaj chcesz wyjść poza zakres?

chyba nie ma czegoś takiego nie? No chyba, że nasłuchasz sobie szum z kosmosu i na tej podstawie wygenerujesz liczby.

@.andy - No ale czy właśnie wciśnięcie w losowym momencie przycisku przez użytkownika nie jest odpowiednikiem kosmicznego szumu? Bo o ile sam algorytm "losujący" liczby nie jest w pełni losowy (aczkolwiek, jak zostało powyżej stwierdzone, w 99% przypadków daje radę) i ich sekwencja jest nie-do-końca random, ale wprowadzając czynnik biologiczny, który w jakimś momencie przerywa serię pseudolosowych numerów, możemy mówić o losowości.

AN
  • Rejestracja: dni
  • Ostatnio: dni
0

Z tym trafieniem poza zakres i powtórnym losowaniem chodzi o rzecz następującą: W pomyśle 1 pobierasz numer setnej sekundy, ona zawsze jest w zakresie od 0 do 9. Potrzebujesz liczbę od 1 do 6 (lub od 0 do 5, co na jedno wychodzi). Jak naciśniesz klawisz w momencie trafienia setnej sekundy od 1 do 6, to taką liczbę bierzesz pod uwagę, np. wypisujesz na ekranie, przemieszczasz pionek w grze czy co tam chcesz. Ale oczywiście możliwe jest, że naciśniesz klawisz w momencie, gdy na pozycji setnej sekundy jest 0 lub 7 lub 8 lub 9. Wtedy masz liczbę poza zakresem. Taki wynik nie jest ważny i powtarzasz cały proces, czyli w praktyce czekasz na ponowne naciśnięcie klawisza.

Oczywiście można zrobić inaczej: Zapamiętać godzinę z dokładnością do setnej sekundy, uruchomić odczekanie klawisza i jeszcze raz pobrać godzinę. Obliczyć ilość setnych sekundy między tymi dwoma momentami i zrobić działanie mod 6, będzie bez przekroczenia zakresu kosztem pewnego skomplikowania.

A w pomyśle nr 2, ten problem można wyeliminować, jeżeli iterator jest dokładnie w zakresie losowanych liczb. Ponieważ cała pętla zamyka się w pojedynczych instrukcjach procesora, obawiam się, że na skrajnych pozycjach pętla potrwa nieco dłużej co zachwieje równomierny rozkład prawdopodobieństwa. Z tego powodu wymyśliłem, żeby z obu stron dodać dodatkowe stany, czyli jak potrzebujesz liczbę od 1 do 6, to tak naprawdę losujesz od 0 do 7. Jak wypadnie 0 lub 7, to powtarzasz losowanie. Innym sposobem, aby ograniczyć nierównomierność prawdopodobieństwa jest dodanie odczekania np. 10ms w biegu pętli. W stosunku do 10 ms, czas sprawdzenia warunku i ewentualnego wyzerowania licznika jest pomijalnie mały.

SI
  • Rejestracja: dni
  • Ostatnio: dni
0

A ten system wbudowany ma pomiar temperatury / napięcia / itp? Bo ostatnia cyfra takowych po przecinku też ci powinna dać liczbę "losową" bez interakcji użytkownika.

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9220
0

@andrzejlisek: ale po co się uparłeś z tym losowaniem czasu? Jakieś setne sekundy itp? Bo skoro użytkownik ma wcisnąć klawisz, to jego ingerencja już zapewnia nam element losowości. Jedynie można się tutaj zastanowić, czy wykorzystywany algorytm zapewni nam równomierny rozkład wylosowanych liczb. Znaczy - czy przy milionach losowań, czy będzie w miarę równomierne pokrycie całego zakresu, czy będą częściej pojawiające się obszary.

.andy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1524
0

@cerrato:

No ale czy właśnie wciśnięcie w losowym momencie przycisku przez użytkownika nie jest odpowiednikiem kosmicznego szumu?

Jeżeli nie wiesz jaki jest czas, to pewnie jest.

Takie coś na szybko napisałem:

Kopiuj
import java.time.LocalDateTime;

public class Main {

    public static void main(String[] args) {
        for(int i=0;i<100;i++){
            System.out.println(generateRandomNumber());
        }
    }

    static int generateRandomNumber() {
        int random = LocalDateTime.now().getNano();
        return random % (6 + 1 - 1) + 1;
    }
}

Przykładowe wylosowane liczby: 5 5 3 1 5 1 3 3 1 5 1 5 3 3 5 5 5 3 1 1 5 1 5 1 1 1 3 5 5 5 1 3 3 1 3 5 1 1 5 3 3 5 5 5 3 1 5 1 3 3 1 3 3 1 3 3 3 5 3 3 5 5 5 5 5 3 3 5 5 1 5 3 3 1 5 3 5 5 5 5 3 5 5 5 3 3 3 1 1 1 3 3 5 5 5 1 3 3 3 5

Dużo piątek ;)

Pewnie by trzeba dać większe i bardziej "losowe" random.

AN
  • Rejestracja: dni
  • Ostatnio: dni
1
cerrato napisał(a):

@andrzejlisek: ale po co się uparłeś z tym losowaniem czasu? Jakieś setne sekundy itp? Bo skoro użytkownik ma wcisnąć klawisz, to jego ingerencja już zapewnia nam element losowości. Jedynie można się tutaj zastanowić, czy wykorzystywany algorytm zapewni nam równomierny rozkład wylosowanych liczb. Znaczy - czy przy milionach losowań, czy będzie w miarę równomierne pokrycie całego zakresu, czy będą częściej pojawiające się obszary.

Taki miałem pomysł, ja się przy tym nie upieram, tylko przedstawiłem jako jeden z dwóch. Pomysł inspirowany zabawą ze stoperem za dzieciaka. Teraz podobnie pobawiłem się stoperem w telefonie i również to, którą cyfrę trafię, zależy bardziej od przypadku niż od zręczności (bo ręką trudno odmierzyć czas z dokładnością do 1/10, a co dopiero do 1/100 sekundy). Poza tym, prawdopodobieństwo trafienia każdej cyfry jest idealne równe, jak idealnie równo zegar podmienia te cyfry.

.andy napisał(a):

@cerrato:

Przykładowe wylosowane liczby: 5 5 3 1 5 1 3 3 1 5 1 5 3 3 5 5 5 3 1 1 5 1 5 1 1 1 3 5 5 5 1 3 3 1 3 5 1 1 5 3 3 5 5 5 3 1 5 1 3 3 1 3 3 1 3 3 3 5 3 3 5 5 5 5 5 3 3 5 5 1 5 3 3 1 5 3 5 5 5 5 3 5 5 5 3 3 3 1 1 1 3 3 5 5 5 1 3 3 3 5

Dużo piątek ;)

Pewnie by trzeba dać większe i bardziej "losowe" random.

Prymitywny algorytm PRNG jest taki sobie, jak sam zauważyłeś (brak równomierności), natomiast dobry algorytm uruchamiany za pomocą zegara (na PC lub w systemie wbudowanym z RTC) przekreśla sens tej dyskusji, natomiast na systemie bez RTC jego zastosowanie nie jest możliwe, bo stan początkowy musiałby być losowany przez użytkownika, co niejako zapętla dyskusję. Rozpoczynam dyskusję, jak losować liczby z udziałem użytkownika, Ty proponujesz algorytm uruchamiany za pomocą zegara, propozycji się nie czepiam, ale na systemie bez zegara to użytkownik by musiał losować i w ten o to sposób wracamy do punktu wyjścia. A w systemie z zegarem, to tym tropem, to albo potrzebny jest algorytm z jakieś biblioteki, albo trzeba go napisać wykorzystując www.google.com dostając PRNG.

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3359
2

Ja nie wiem co chcesz osiągnąć, jeżeli zwyczajnie wylosować liczbę 1-6 i potrzebujesz równomierny rozkład losowań (czyli robisz taką elektroniczną kostkę), to co jest złego w:
(timeMilisecFromApplicationStart % 6) + 1`? Możesz to zrobić na przerwaniu nawet, nie potrzebujesz RTC.

AN
  • Rejestracja: dni
  • Ostatnio: dni
0
piotrpo napisał(a):

(timeMilisecFromApplicationStart % 6) + 1`? Możesz to zrobić na przerwaniu nawet, nie potrzebujesz RTC.

W tym nie ma nic złego, o ile na danej platformie system podaje czas z dokładnością do milisekundy (spotkałem się z opiniami, że zdarzają się przypadki chyba w .NET, iż teoretycznie można dostać czas z dokładnością do milisekundy, ale w praktyce na Windows liczba milisekund zmienia się powiedzmy co 18 milisekund). Na setnej na ogół nie ma tego problemu, ale dokładność zegara systemowego to już dyskusja na inny wątek.

Rozumiem, że od startu aplikacji do pobrania "timeMilisecFromApplicationStart" jest naciśnięcie klawisza lub klikniecie czegoś, w takim razie otrzymuje się inny wariant pomysłu nr 1. A jeżeli jest to system bez RTC, ale jest licznik bądź generator wyzwalający przerwanie w regularnych odstępach czasu, to wychodzi na to samo (we funkcji obsługi przerwania inkrementuje się licznik, a "wylosowana" liczba to stan licznika w momencie naciśnięcia klawisza).

Jakiś czas temu na innym forum napisałem https://www.elektroda.pl/rtvforum/viewtopic.php?p=16418494#16418494 gdzie w ramach hobby napisałem prostą gierkę na prosty komputerek bez RTC, stosując wariant nr 2 i jak widać, od razu spotkałem się z podważeniem słuszności takiego rozwiązania, argument, że takie rozwiązanie nie nadaje się do prawdziwego automatu do gier to zupełnie inna sprawa, brakło argumentu dotyczącego równomierności losowania. Właśnie po to założyłem ten temat na tym forum.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2399
0

Czy w tym przypadku masz możliwość zaczytania informacji z niezainicjalizowanej pamięci SRAM i użycia jej jako stanu początkowego dla jakiegoś generatora liczb pseudolosowych? Taki seed byłby używany pewnie raz na uruchomienie urządzenia.

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3850
0
andrzejlisek napisał(a):

Pomysł 1 - system zawierający zegar czasu rzeczywistego z możliwością odczytu setnych sekundy:

Problem jest taki, że zegar czasu rzeczywistego odmierza setne sekundy po kolei - przy dużej serii losowań wyniki będą zaburzone i będą blisko siebie w pierścieniu.

Pomysł 2 - system, który nie zawiera zegara czasu rzeczywistego:

Tutaj problem jest taki sam jak wcześniej - chyba, że zrobisz timeout dla gracza i każda iteracja będzie inna (tj. najpierw cyfry pokażą się w tej kolejności: 1,5,2,6,4,3; potem 3,6,2,1,5,4; potem 2,4,5,1,3,6 itp.). Wtedy jednak taki system nie jest dobrym generatorem liczb losowych - ale może być wystarczającym do twoich rozwiązań.

Tradycyjnym sposobem na znalezienie faktycznej wartości losowej jest pomiar szumu tła - czy to będzie napięcie (wtedy dobry miernik trzeba mieć), głośność czy natężenie jakiegoś pola. Oczywiście tutaj dużo zależy od warunków fizycznych (nie wszędzie da się wszystko zmierzyć).

AN
  • Rejestracja: dni
  • Ostatnio: dni
0
yarel napisał(a):

Czy w tym przypadku masz możliwość zaczytania informacji z niezainicjalizowanej pamięci SRAM i użycia jej jako stanu początkowego dla jakiegoś generatora liczb pseudolosowych? Taki seed byłby używany pewnie raz na uruchomienie urządzenia.

Załóżmy, że mam, jest to jakieś rozwiązanie.

wartek01 napisał(a):
andrzejlisek napisał(a):

Pomysł 1 - system zawierający zegar czasu rzeczywistego z możliwością odczytu setnych sekundy:

Problem jest taki, że zegar czasu rzeczywistego odmierza setne sekundy po kolei - przy dużej serii losowań wyniki będą zaburzone i będą blisko siebie w pierścieniu.

Pomysł 2 - system, który nie zawiera zegara czasu rzeczywistego:

Tutaj problem jest taki sam jak wcześniej - chyba, że zrobisz timeout dla gracza i każda iteracja będzie inna (tj. najpierw cyfry pokażą się w tej kolejności: 1,5,2,6,4,3; potem 3,6,2,1,5,4; potem 2,4,5,1,3,6 itp.). Wtedy jednak taki system nie jest dobrym generatorem liczb losowych - ale może być wystarczającym do twoich rozwiązań.

Proszę o wyjaśnienie, bo ja chyba nie rozumiem jednej rzeczy. Po drodze pojawiły się propozycje połączenia algorytmu PRNG i cyklu. Ja wracam do swojego pierwotnego pomysłu.

Posłużę się analogią, która pasuje do obu pomysłów: Siedzę z kolegą przy stole na przeciw siebie, nie mamy zegarków ani żadnych urządzeń wydających bodźce co określony czas (np. słyszalnie tykający zegar, pomimo, że jest on schowany lub zasłonięty). Kolega ma 10 karteczek z zapisanymi na niej cyframi, uszeregowane w kolejności cyfr. Kolega kładzie pierwszą karteczkę na pewien czas, cyfrą do dołu, potem zabiera ją i kładzie następną. Przyjmijmy, że czas potrzebny na zabranie kartki i położenie następnej jest pomijalnie krótki. Jak kolega zdejmuje ostatnią karteczkę, to znowu kładzie pierwszą i tak w kółko. Ja przez pewien czas patrzę na sufit. W pewnym momencie kieruję wzrok na stół i kładę rękę na położonej karteczce, w tym momencie kolega natychmiast przerywa cykliczną zamianę kartki, a ja odwracam karteczkę (uznajmy, że cały ciąg zdarzeń wymienionych w tym zdaniu następuje w pomijalnie krótkim czasie) i to jest wylosowana cyfra. Dla czystości sprawy jeszcze jedno założenie: Nie jest możliwe położenie ręki w czasie wymiany karteczki, w każdym jednym momencie na stole jest jedna karteczka. Mam nadzieję, że na tym etapie jest to zrozumiałe.

Teraz, hipotetycznie przyjmijmy, że kolega jest zdolny kłaść każdą karteczkę na czas 1/100 sekundy (a czas samej wymiany karteczki jest zaniedbywalnie krótki), czyli wszystkie karteczki będą położone łącznie w ciągu 1/10 sekundy. Czy to coś zmienia, czy położę rękę po 5 minutach, czy po pół godzinie, czy po kilku godzinach (ogólne założenie jest takie, żeby czas od rozpoczęcia do położenia ręki trwał minimum kilkaset razy tyle, ile trwa wyłożenie wszystkich karteczek po kolei)? Czy zmiana kolejności wykładanych kartek coś zmieni? Przy takich założeniach, to już po kilku sekundach zatraca się panowanie, w którym momencie rozpoczyna się kolejna sekunda, a tutaj cykl trwa 10 razy krócej.

A jeżeli zatraci się poczucie kolejnych sekund w głowie, to czy w ogóle coś się zmieni, jeżeli się jeszcze przyspieszy, czyli zamiana karteczki jest co milisekundę, a więc na sekundę przypada 100 cykli?

A gdyby całą zabawę powtórzyć 10 razy i za każdym razem położyć rękę po mniej więcej 10 minutach (bez zegarka, tak na wyczucie), to czy losowość będzie zaburzona? jeżeli tak, to dlaczego?

A teraz proporcjonalnie w drugą stronę. Karteczka zamieniana jest co jedną sekundę, natomiast ja czekam mniej więcej jedna dobę i chwytam aktualnie położoną karteczkę. Czy to coś zmieni? Czy będzie różnica, czy karteczka będzie wymieniana co 0,9, czy co 1,1 sekundy (ale w całym procesie każda karteczka jest eksponowana tyle samo czasu)?

Czy teraz widać podobieństwo opisanej zabawy i programu, od którego rozpocząłem dyskusję? Moim zdaniem taki właśnie program by wyszedł, jakby przełożyć opisaną zabawę na program, w którym komputer pełni funkcję kolegi, który wykłada karteczki, a naciśnięcie klawisza odpowiada położeniu ręki na karteczce, która w danym momencie jest na stole.

Tradycyjnym sposobem na znalezienie faktycznej wartości losowej jest pomiar szumu tła - czy to będzie napięcie (wtedy dobry miernik trzeba mieć), głośność czy natężenie jakiegoś pola. Oczywiście tutaj dużo zależy od warunków fizycznych (nie wszędzie da się wszystko zmierzyć).

To prawda i problem tak stary, jak stare są komputery (nie ważne, czy na lampach, czy na tranzystorach, czy na układach scalonych), ciekawe, dlaczego żaden producent procesorów nie wyposażył go w generator szumu, że po prostu na liście rozkazów będzie rozkaz pobierający odpowiednio przetworzoną wartość z tego generatora, np. 0-255 z rozkładem równomiernym lub wartość 0 lub 1 z prawdopodobieństwem 50/50 (to przetworzenie miałoby na celu skompensowanie nieidelanych właściwości analogowego generatora). Obecnie to chyba żaden problem technologiczny.

AN
  • Rejestracja: dni
  • Ostatnio: dni
0

Niedawno czytałem co nieco o grach losowych i przypomniał mi się ten temat. Jeżeli w grze jest jakiś generator losowy lub pseudolosowy i wynik zależy od wartości z tego generatora, to sprawa jest oczywista, taka gra w Polsce może być wyłącznie w kasynie lub salonie Totalizatora Sportowego (gry losowe "dla zabawy", czyli bez możliwości wygrania również podlegają ograniczeniom).

To w takim razie, jeżeli w grze nie ma generatora liczb losowych ani pseudolosowych, a wynik gry zależy od momentu naciśnięcia przycisku, przy czym przed naciśnięciem użytkownik nie ma możliwości śledzenia stanu gry, więc wydaje się, że losuje (np. liczbę z jakiegoś niewielkiego zbioru), to czy taka gra jest losowa i podlega ograniczeniom prawnym, czy już nie jest losowa i może być udostępniana w dowolnym miejscu obok fliperów i gier komputerowych na monety?

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
0

To pytanie do prawników, nie programistów.

Podejrzewam, że taka gra wciąż mogłaby zostać uznana za losową, tak jak za losową oznaje się totolotka, chociaż on też, technicznie rzecz biorąc, jest ściśle deterministyczna (tylko układ chaotyczny).

AN
  • Rejestracja: dni
  • Ostatnio: dni
0
Althorion napisał(a):

To pytanie do prawników, nie programistów.

Podejrzewam, że taka gra wciąż mogłaby zostać uznana za losową, tak jak za losową oznaje się totolotka, chociaż on też, technicznie rzecz biorąc, jest ściśle deterministyczna (tylko układ chaotyczny).

Natomiast do programistów cały czas mam pytanie, zawarte w poprzednim moim poście (analogia do karteczek z liczbami). Tak, jak maszyna do totolotka lub koło w ruletce teoretycznie da się zamodelować komputerowo, to liczba czynników wpływajacych na wynik jest tak duża, że uznaje się za losowe. Wystarczy, że krupier przyłoży lulkę o pół milimetra wyżej lub niżej, to ruch kuleczki będzie miał całkiem inny przebieg, a sam krupier nie jest temu świadomy. Nie wiem, czy robiono analizy równomierności losowania takich urządzeń.

Z powyższego wynika, że liczbę od 0 do 9 można wygenerować tak:

  1. Włączam stoper.
  2. Patrząc poza stoper liczę w myślach powoli do 10.
  3. Wyłączam stoper.
  4. Odczytuję cyfrę na setnych sekundy.

Skoro czynność trwa 10-15 sekund to trudno wstrzelić się w zaplanowaną setkę sekundy, choć teoretycznie jest to możliwe. Stąd wynika pytanie: Czy powtarzając czynność wielokrotnie uzyskam ciąg cyfr o rówomiernym rozkładzie i prawdziwej losowości? Inną sprawą jest to, że w praktyce nie jest możliwe wylosowanie dużej ilości cyfr w krótkim czasie.

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
1

Przetestuj, to będziesz wiedział. W idealnych warunkach — tak. W fatalnych warunkach — nie. Komputer pod dużym obciążeniem, szczególnie przy wolno przełączającym planiście, może zacząć zaburzać te wyniki. Nie oczekiwałbym, żeby było to zauważalne do poziomu oblewania testów statystycznych, ale jest możliwe.

AN
  • Rejestracja: dni
  • Ostatnio: dni
0
Althorion napisał(a):

Przetestuj, to będziesz wiedział. W idealnych warunkach — tak. W fatalnych warunkach — nie. Komputer pod dużym obciążeniem, szczególnie przy wolno przełączającym planiście, może zacząć zaburzać te wyniki. Nie oczekiwałbym, żeby było to zauważalne do poziomu oblewania testów statystycznych, ale jest możliwe.

W przypadku komputera czy smartfonu taka zabawa w 95% przypadków nie ma najmniejszego sensu, ale w przypadku mikrokontrolera, czy minikomputera, w którym nie ma zegara czasu rzeczywistego, a jest licznik, który może zliczać impulsy poprzez generowanie przerwania, to wydaje się, że ma to sens. W mikrokontrolerach nie ma żadnego systemu operacyjnego, ani planisty, bo jest uruchomiony jeden program. Konsola Nintendo NES też spełnia ten warunek (brak RTC, brak OS, jeden program naraz), np. w grze Pictionary przed rzutem kostką gracz musi wcisnąć przycisk, podejrzewam, że przed wciśnięciem licznik liczy w kółko od 1 do 6 i decyduje moment naciśnięcia. Do takich gier jakość losowości nie ma większego znaczenia (wystarczy jakiś prosty pseudorandom), ale z drugiej strony gracz to jedyny czynnik zewnętrzny.

Co do testów, to znalazłem coś: link i tam jest link do programu testującego.

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.