• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
556 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 994 wizyt
0 głosów
3 odpowiedzi 1,034 wizyt
pytanie zadane 12 stycznia 2017 w C i C++ przez pokrywa1 Użytkownik (990 p.)
0 głosów
1 odpowiedź 154 wizyt
pytanie zadane 16 marca 2016 w C i C++ przez Corazzo Obywatel (1,040 p.)

93,187 zapytań

142,203 odpowiedzi

322,022 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2345p. - dia-Chann
  2. 2306p. - Łukasz Piwowar
  3. 2295p. - Łukasz Eckert
  4. 2282p. - CC PL
  5. 2252p. - Tomasz Bielak
  6. 2219p. - Łukasz Siedlecki
  7. 2215p. - rucin93
  8. 2201p. - Michal Drewniak
  9. 2156p. - Marcin Putra
  10. 2152p. - Adrian Wieprzkowicz
  11. 2105p. - Mikbac
  12. 1941p. - Anonim 3619784
  13. 1733p. - rafalszastok
  14. 1480p. - Michał Telesz
  15. 1469p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...