• 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?

Object Storage Arubacloud
0 głosów
233 wizyt
pytanie zadane 31 grudnia 2015 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 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,460 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,460 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 244 wizyt
pytanie zadane 8 lutego 2016 w C i C++ przez Noak Mądrala (5,900 p.)
0 głosów
4 odpowiedzi 485 wizyt
pytanie zadane 17 listopada 2015 w C i C++ przez subterras Użytkownik (680 p.)
0 głosów
1 odpowiedź 206 wizyt
pytanie zadane 20 października 2015 w Inne języki przez Krzysztof Rampa Nowicjusz (190 p.)

92,624 zapytań

141,482 odpowiedzi

319,824 komentarzy

62,006 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...