Dlaczego maksymalna wartość wylosowanej liczby to 32767 ?

0

Hmm jak w temacie, przy wykorzystaniu:

srand(time(NULL));
rand()%1000000+1; // przykładowo//
0
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?

4

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ę.

0

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;
}
3

C++11 daje ci inne generatory liczb pseudolosowych, które są lepsze i wyraźnie zdefiniowane.
https://en.cppreference.com/w/cpp/header/random

2

U mnie RAND_MAX = INT_MAX, czyli 2³²-1. Mimo wszystko ponawiam apel: piszesz w C++ - nie używaj randa

0
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...

0
kq napisał(a):

U mnie RAND_MAX = INT_MAX, czyli 2³²-1.

A u mnie po sprawdzeniu RAND_MAX to 1447632767 :p

3

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.

0

2^15 - 1 = 32767. I wszystko jasne, dzięki:p

1

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. MusluClib mają tę samą wartość.

1

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1