Hmm jak w temacie, przy wykorzystaniu:
srand(time(NULL));
rand()%1000000+1; // przykładowo//
Bo używasz rand()
. https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/
kq napisał(a):
Bo używasz
rand()
. https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/
No wiem :D, że to wynika z tego że korzystam z rand(), dlatego właśnie o to pytam, z czego to wynika, że to akurat taka to max liczba? Czy ktoś wie?
Implementacja (mniej więcej: kompilator) może sobie wybrać RAND_MAX
i ustawić takie jak jej się podoba, minimum to właśnie 32767. Twórcy twojego kompilatora (MSVC jakiś starszy? Czy mingw/devcpp z ery prezydenta Busha?) poszli na łatwiznę.
Otóż moje pytanie wzięło się stąd że pisze losowanie z rand'em: ; Wyniki nie przekraczaly ok40tys, wiec szukalem na innych forach i znalazlem takie info z tą max liczbą i chciałem wiedziec skąd to wynika, ale rozumiem że to wartość zależna od kompilatora.. W takim razie nowsze kompilatory przekroczą przykładowo .. milion?
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <windows.h>
using namespace std;
int main()
{
cout << "Ile liczb losowac?";
int dlugosc_tab;
cin >> dlugosc_tab;
int * tablica;
tablica = new int [dlugosc_tab];
srand(time(NULL));
for (int i=0; i<dlugosc_tab;i++)
{
*(tablica+i) = rand()%1000000+1;
cout << endl << *(tablica+i);
if (*(tablica+i)>100000)
{
cout << "Przekroczono 100000 ";
getchar();
exit(0);
}
Sleep(50);
}
getchar();
return 0;
}
C++11 daje ci inne generatory liczb pseudolosowych, które są lepsze i wyraźnie zdefiniowane.
https://en.cppreference.com/w/cpp/header/random
MarekR22 napisał(a):
C++11 daje ci inne generatory liczb pseudolosowych, które są lepsze i wyraźnie zdefiniowane.
https://en.cppreference.com/w/cpp/header/random
Jasne, chciałem znać tylko powód dlaczego rand() daje takie ograniczenie...
kq napisał(a):
U mnie
RAND_MAX
=INT_MAX
, czyli 2³²-1.
A u mnie po sprawdzeniu RAND_MAX to 1447632767 :p
Proste: mvsc to stary kompilator, który działał jeszcze na systemach 16 bitowych, więc generator ten był dostosowany do liczb 16 bitowych. A jako, że uwzględnili znak to ostało się 15 bitów.
Potem trzeba było utrzymać wsteczną kompatybilność i masz taki kwiatek.
Bo takie jest minimalne ograniczenie, jakie może legalnie dawać.
Twórcy standardu do C++ wymyślili sobie, że w każdej poprawnej implementacji tego języka musi być funkcja rand()
, która musi zwracać liczby pseudolosowe rozłożone jednorodnie od zera do RAND_MAX
(która to wartość siedzi w <cstdlib>
, jakbyś chciał ją poznać), a samo RAND_MAX
musi być co najmniej równe 32767
. Dlaczego tak? Pewnie wywróżyli z fusów…
Jeśli Ci się to nie podoba, możesz użyć innej implementacji biblioteki standardowej. Np. u mnie, korzystającego z glibc-a 2.28 na Linuksie na amd64, ta wartość to 2 147 483 647
. Musl i uClib mają tę samą wartość.
Dlaczego to tak mała liczba?
Funkcja rand() pochodzi z C: https://en.cppreference.com/w/c/numeric/random/rand
C działa na różnych maszynach, w tym na 8-bitowych: http://www.worldofspectrum.org/infoseekid.cgi?id=0008252
Niestety twórcy C++ długo nic lepszego nie potrafili lub nie chcieli wymyślić.
Od C++11 można już stosować ww generatory, które można uznać, że przynajmniej nie budzą życzliwego półśmieszka, natomiast AFAIK nadal nie są kryptograficznie bezpieczne (nawet w sumie nie wiem czy muszą być).
https://stackoverflow.com/questions/44867500/is-stdrandom-device-cryptographic-secure
std::random_device
, które korzysta ze sprzętowych generatorów (o ile się taki ma…), ale faktycznie żaden z wymaganych standardem generatorów nie nadaje się do kryptografii. Swoją drogą, ciekawi mnie, dlaczego — tzn. dlaczego nie wprowadzono wymogu implementacji chociażby ze dwóch uznawanych za bezpieczne.
std::random_device
jest o tyle słaby, że może być hardwarowe'y, ale nie musi. Dość spojrzeć na większość implementacji mingw, które zwracają zawsze tę samą sekwencję - wtf!