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

Generator LCG w C++

Object Storage Arubacloud
+1 głos
430 wizyt
pytanie zadane 14 marca 2022 w C i C++ przez osobliwy nick Użytkownik (900 p.)
edycja 14 marca 2022 przez osobliwy nick

Piszę swój pierwszy program w C++. Umiem trochę programować w Pythonie i usiłuję zaprogramować na początek to co jest banalne w Pythonie w C++.

Tak wygląda program:

#include <iostream>
#include <cmath>

long long rand()
{
    long long LCG_state = 3;
    LCG_state = (LCG_state * 2891336453 + 3018536797) & 4294967295;
    return LCG_state;
}

int main()
{
    for(int i=0; i<6; i++)
    std::cout << rand() << "\n";
    return 0;
}

Ale nie działa. Nie rozumiem dlaczego, ani też nie rozumiem internetowych wyjaśnień błędów, które się wyświetlają. "error: ambiguating new declaration of 'long long int rand()" - zmiana na inny typ zmiennej nie pomaga.

Program ma obliczać kolejno stany generatora, poprzez proste mnożenie z dodawaniem mod 2^32. Poprzedni stan generatora mnożymy przez określone liczby i uzyskujemy nowy stan. I tak w kółko. Program ma wypisywać wyniki tych obliczeń.

Co zrobiłem nie tak, że to nie działa? 

komentarz 14 marca 2022 przez kolmipilot Obywatel (1,570 p.)
w jakim programie?
komentarz 14 marca 2022 przez osobliwy nick Użytkownik (900 p.)

W tym:

#include <iostream>
#include <cmath>
 
long long rand()
{
    long long LCG_state = 3;
    LCG_state = (LCG_state * 2891336453 + 3018536797) & 4294967295;
    return LCG_state;
}
 
int main()
{
    for(int i=0; i<6; i++)
    std::cout << rand() << "\n";
    return 0;
}

 

komentarz 14 marca 2022 przez Oscar Nałogowiec (29,320 p.)

@osobliwy nick, po prostu w C jest już funkcja rand(), stąd problemy. Kompilator pisze, że nie może ich rozróżnić (C++ umożliwia przeciążanie, ale muszą się różnić parametry)

Po drugie - zmienna LGC_state musi być static, bo inaczej zawsze dostaniesz to samo.

 

komentarz 14 marca 2022 przez osobliwy nick Użytkownik (900 p.)

Ale teraz nie jest static i nie dostaję tego samego.

#include <iostream>
#include <cmath>

long long LCG_state = 3;

long long LCG()
{
    LCG_state = (LCG_state * 2891336453 + 3018536797) & 4294967295;
    return LCG_state;
}

int main()
{
    for(int i=0; i<6; i++)
    std::cout << LCG() << "\n";
    return 0;
}

 

komentarz 14 marca 2022 przez osobliwy nick Użytkownik (900 p.)

Swoją drogą, czy można polegać na tym czasie wyświetlanym w konsoli "Process returned 0 (0x0)   execution time : 0.049 s"?

Chcę porównać prędkości kilku programów i w porównaniu do Pythona, który uruchamiam w terminalu Pycharma, z mierzeniem czasu za pomocą:

time.time()

różnica jest ogromna. Tak na oko, to się wykonuje 100 razy szybciej, niż w terminalu w Pycharmie (oczywiście zapętlam same obliczenia LCG, bez wypisywania wyników). W sumie to by się zgadzało z różnymi opracowaniami, które mówią o tym, że C++ jest 50-100 razy szybszy.

1
komentarz 14 marca 2022 przez Oscar Nałogowiec (29,320 p.)

Zmienna static wewnątrz funkcji czy zmienna na zewnątrz funkcji to w sumie to samo (taki sam czas życia, różny zakres widoczności).

Uruchamiaj program, poprzedzając jego nazwę poleceniem time.

time ./moj_program 

Dostaniesz kilka wyników:

real    0m4,145s
user    0m0,134s
sys     0m0,152s

Jak widać są różne czasy wykonania - real  - czas zegarkowy, user - czas CPU (dałem polecenie grep, które działa na plikach, dużo czasu zajmują operacje I/O).

1 odpowiedź

0 głosów
odpowiedź 14 marca 2022 przez osobliwy nick Użytkownik (900 p.)

Ten kod działa:

#include <iostream>
#include <cmath>

long long LCG_state = 3;

long long LCG()
{
    LCG_state = (LCG_state * 2891336453 + 3018536797) & 4294967295;
    return LCG_state;
}

int main()
{
    for(int i=0; i<6; i++)
    std::cout << LCG() << "\n";
    return 0;
}

Gdzieś jednak widziałem deklarowanie long long LCG_state =  w środku funkcji LCG. U mnie to nie działało. Nie wiem dlaczego i, czy faktycznie tak można robić.

Podobne pytania

0 głosów
1 odpowiedź 235 wizyt
0 głosów
1 odpowiedź 1,096 wizyt
0 głosów
0 odpowiedzi 203 wizyt
pytanie zadane 7 maja 2021 w C i C++ przez MuratPasza Nowicjusz (120 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 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!

...