• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Losowanie pseudolosowe nie jest do końca losowe?

Aruba Cloud - Virtual Private Server VPS
0 głosów
317 wizyt
pytanie zadane 31 grudnia 2015 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,480 p.)

Witam, napisałem prosty, działający symulator trafienia 6 w lotto. Niby sporo tego w sieci, ale chciałem zrobić coś od siebie, dołożyć małą cegiełkę. Program jest w pełni funkcjonalny, jednakże odkryłem pewną dziwną sprawę. 

Zamieszczam kod: 

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <iomanip>

using namespace std;

int main()
{
    srand(time(NULL));
    long double proba=0;
    int ile_wybrac = 6;
    int ile_wylosowac = 6;
    int ile_juz_wylosowano=0;
    int *l = new int[ile_wybrac];
    int *lk = new int[ile_wylosowac];
    bool losowanie_ok;

    cout<<"Witaj w symulatorze zdobycia 6 w lotto!"<<endl<<endl;

    for (int i=0; i<ile_wybrac; i++)
    {
        cout<<"Podaj "<<i+1<<". liczbe w zakresie 1-49: ";
        l[i]=0;
        cin>>l[i];
    }
    do
    {
        ile_juz_wylosowano=0;
        
        for (int i=0; i<ile_wylosowac; i++)
        {
            do
            {
                int liczba=rand()%49+1;
                losowanie_ok=true;
                
                    for (int i=0; i<=ile_juz_wylosowano; i++)
                    {
                        if (liczba==lk[i]) losowanie_ok=false;
                    }
                    
                    if (losowanie_ok==true)
                    {
                        lk[ile_juz_wylosowano]=liczba;
                        ile_juz_wylosowano++;
                    }
                    
            } while (losowanie_ok!=true);
        }
        
    proba++;
    
    } while ((l[0]!=lk[0])||(l[1]!=lk[1])||(l[2]!=lk[2])||(l[3]!=lk[3])||(l[4]!=lk[4])); //||(l[5]!=lk[5]));
    

    cout<<setprecision(100000)<<"Udalo ci sie trafic 6 przy "<<proba<<" losowaniu"<<endl<<endl;

    cout<<"Liczby wybrane przez ciebie  : "<<l[0]<<" "; cout<<l[1]<<" "; cout<<l[2]<<" "; cout<<l[3]<<" "; cout<<l[4]<<" "; cout<<l[5]<<" "<<endl;
    cout<<"Liczby wybrane przez komputer: "<<lk[0]<<" "; cout<<lk[1]<<" "; cout<<lk[2]<<" "; cout<<lk[3]<<" "; cout<<lk[4]<<" "; cout<<lk[5]<<" "<<endl;

    return 0;
}

 

Końcowy warunek do...while(); sprawdza tylko 5, a nie 6 cyfr, z oczywistego powodu. Nie chce mi się czekać kilku godzin aby otrzymać liczbę prób za którym razem trafiło się 6. 

Sprawa całego tematu na forum jest następująca: Zawsze, ilekroć razy uruchomię od nowa program i jako liczby do porównania wprowadzę wartości 1 2 3 4 5 6 (po endl nie spacji) i zaczekam na pokazanie ilości prób, to ZAWSZE inna jest liczba prób (zazwyczaj zaczyna się od kilku milionów, a kończy na miliardach), a ostatnia cyfra , czyli cyfra 6 losowania przez komputer wynosi 41. Wylosowane liczby przez komputer pasujące do moich zawsze wyświetlone są na końcu programu. Dlaczego 41 i dlaczego po innych ilościach prób? Czy liczby pseudolosowe to jakiś nietypowo powtarzający się ciąg liczbowy? Poniżej zamieszczam kilka dowodów robionych przy pomocy zwykłego screenshootera. Możecie skompilować kod u siebie i sprawdzić czy u was również będzie to 41. Pozdrawiam!  

1. https://gyazo.com/6ee4904f61a4a25ce281a2a02f5b7b02

2. https://gyazo.com/3609720c37e42e45240657b2f2084330

3. https://gyazo.com/89b0f8b8dc0a17dd620dc32b509655da

 

Wiem, ostatnio dużo pytań zadaję na tym forum, ale od tego ono jest prawda? :) 

2 odpowiedzi

+1 głos
odpowiedź 31 grudnia 2015 przez Michał628496 Pasjonat (17,340 p.)
edycja 31 grudnia 2015 przez Michał628496

Ja na razie tylko skompilowałem. Taki sam  efekt jak u Ciebie :)

EDIT:

W linijce 38 tworzysz pętlę , w której nadpisujesz zmienną używaną przez pętlę w linijce 31

po za tym w tej pętli wychodzisz poza tablicę lk

jak zmieniłem w tamtym miejscu na int j=0 j<Ile_juz_wylosowano;j++

to ostatnią liczbą było 12

komentarz 31 grudnia 2015 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
Czy taka zmienna używana przez pętle for nie jest zmienną lokalną używaną tylko przez tą pętlę?
komentarz 1 stycznia 2016 przez niezalogowany
Dokładnie tak. Sam odpowiedziałeś sobie na pytanie. Przecież ten drugi for jest zagnieżdżony w pierwszym, prawda?
komentarz 1 stycznia 2016 przez Konrad Nabożny Stary wyjadacz (13,480 p.)
Racja, racja. Jaka ze mnie gafa :D Dzięki!
+1 głos
odpowiedź 31 grudnia 2015 przez Mesiak Bywalec (2,380 p.)
Generalnie odpowiem tylko na jedno pytanie gdyż nie mam pojęcia dlaczego jest to 41. Pseudolosowość polega na pobraniu liczby z licznika czasu w każdym komputerze (ten domyślnie w prawym dolnym rogu) przez to potrzebna Ci było srand(time(NULL)) jak i biblioteka <time.h> po której nazwie można łatwo wywnioskować że chodzi o czas. Na pewno oglądałeś poradnik pana Mirosława w którym tłumaczył jak to działa. Jeżeli chcesz sprawdzić działanie tej losowości to stwórz program w którym stworzysz zmienną "a" której wartość będzie losowa z przedziału 0-100. Następnie wypisz ją zwykłym coutem. Uruchom swój program zobacz jaką liczbę dostaniesz potem szybko go zamknij i uruchom ponownie. Zauważysz że liczby te będą rosnąć, bo szybkim ponownym uruchomieniu programu np. po liczbie 20 nie będzie 8, lecz rosnąco 30-40. Twój program pierwszą liczbę losuje według tej zasady, ale kolejna liczba losowana jest w zależności od poprzedniej przez co program da wrażenie już niemalże idealnej losowości, lecz nie będzie ona 100% losowa zawsze będzie działała na pewnej zasadzie, ale w tym przypadku już nie rosnąco.
komentarz 31 grudnia 2015 przez niezalogowany

Pseudolosowość polega na pobraniu liczby z licznika czasu w każdym komputerze (ten domyślnie w prawym dolnym rogu)

No nie, ziarnem nie musi być czas chociaż zazwyczaj jest to wystarczające rozwiązanie.

Definicja pseudo-losowości jest nieco inna

Podobne pytania

0 głosów
2 odpowiedzi 310 wizyt
pytanie zadane 8 lutego 2016 w C i C++ przez Noak Mądrala (5,900 p.)
0 głosów
4 odpowiedzi 798 wizyt
pytanie zadane 17 listopada 2015 w C i C++ przez subterras Użytkownik (680 p.)
0 głosów
1 odpowiedź 241 wizyt
pytanie zadane 20 października 2015 w Inne języki przez Krzysztof Rampa Nowicjusz (190 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,662 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...