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

Duże liczby losowe (rand) - wychodzą same ujemne

Cloud VPS
0 głosów
593 wizyt
pytanie zadane 2 marca 2016 w C i C++ przez Rayden Użytkownik (610 p.)

Witam !

Chciałbym wygenerować 1000, a nawet 20,000 liczb pseudolosowych z przedziału liczby całkowitej - Integer (-2147483648; 2147483647). Za każdym razem po wykonaniu tego kodu:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <ctime>
using namespace std;

int main(){
    fstream myfile;
    srand(time(NULL));
    myfile.open ("liczby.txt", std::ios::in | std::ios::out);
        for(int i=0; i<200; i++){
            int liczba = rand() %4294967294 + (-2147483648);
            myfile << liczba << "\n";
            }
        myfile.close();
    return 0;
}

W pliku liczby.txt generują mi się podobne liczby ujemne, takie jak: 

-2147469643
-2147483188
-2147473308

Analiza: 
rand() %4294967294 + (-2147483648);

Liczba  4294967294 to górna granica integera pomnożona przez 2 i od tego odjęta dolna granica, czyli  -2147483648  -> żeby nie wyjść poza przedział Integera.

Skrajny przypadek nr 1: wylosowało mi największą liczbę dodatnią i od tej liczby odejmuję właśnie -2147483648

4294967294 -2147483648 = 2147483646, a więc liczba mieści się w przedziale.

Skrajny przypadek nr 2: wylosowało mi najmniejszą liczbę dodatnią i od tej liczby odejmuję właśnie -2147483648

0 -2147483648 = -2147483648, a więc liczba mieści się w przedziale.

Nie wiem, gdzie popełniam błąd. Na koniec dodam, że próbowałem również zakodować ten problem w JAVIE, ale losuje te same duże ujemne liczby.

Z góry dziękuję za pomoc ! =)

1 odpowiedź

+4 głosów
odpowiedź 2 marca 2016 przez MetGang Nałogowiec (34,360 p.)

http://www.cplusplus.com/reference/cstdlib/rand/

A dokładniej

Returns a pseudo-random integral number in the range between 0 and RAND_MAX.

gdzie RAND_MAX ma wartość 32767 (GCC 4.9.2), a więc nie ma możliwości poprawnego wylosowania tak dużych liczb.

Do operowania na dużych liczbach (lub zmiennoprzecinkowych) polecam <random> z C++

http://www.cplusplus.com/reference/random/

Przykład:

std::mt19937 RNG;
std::uniform_int_distribution<int> Distribution(Min,Max);
int RandomNumber = Distribution(RNG);

 

Podobne pytania

0 głosów
2 odpowiedzi 1,089 wizyt
0 głosów
3 odpowiedzi 1,146 wizyt
pytanie zadane 12 stycznia 2017 w C i C++ przez pokrywa1 Użytkownik (990 p.)
0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 16 marca 2016 w C i C++ przez Corazzo Obywatel (1,040 p.)

93,482 zapytań

142,414 odpowiedzi

322,761 komentarzy

62,894 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

Kursy INF.02 i INF.03
...