Losowanie liczb double/float

0

Jak wylosować liczby float (albo double - w sumie i te, i te) w C++? Losowanie liczb całkowitych jest proste, ale nie wiem, jak wylosować floaty bądź double

Chodzi o konkertny przedział, np. liczby losowe double/float z przedziału [0.0, 1.0]

0

Wylosować liczbę z zakresu 0-100 i podzielić przez 100 (oczywiście, jeżeli z losowania wyszła liczba > 0)?
Niektórzy ludzie to zamiast pomyśleć od razu walą na forum...

0

Gdyby to bylo takie proste, to bym nie pytał. Podany niżej kod ciągle wypisuje mi zero :/ :

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main(int argc, char **argv){

    int min = 0;
    int max = 100;
    srand(time(NULL));

    int losowa = rand()%(max-min+1)+min;

    float wylosuj = losowa/100;

    cout << wylosuj << endl;

    return 0;
}

Aaa, faktycznie, ale to nic nie zmienia, dalej wypluwa 0 :/ (nawet nie 0.0) ;

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main(int argc, char **argv){

    int min = 0;
    int max = 100;
    srand(time(NULL));

    int losowa = rand()%(max-min+1)+min;

    float wylosuj = 0.0;

    if (losowa > 0)
        wylosuj = losowa/100;
    else
        wylosuj = 0.0;

    cout << wylosuj << endl;

    return 0;
}
0

Dzieje się tak dlatego, że losowa/100 to jest dzielenie całkowite - zmień na losowa/100.0f

0

Dzięki, poszło. A jeśli miałbym używać tej funkcji w programie wieeeele razy, to srand(time(NULL)); użyć tylko 1 raz, na początku maina?

0

The C++ way:

  std::mt19937 engine(static_cast<int>(time(nulptr)));
  std::uniform_real_distribution<> distribution(a, b);
  auto random = std::bind(distribution, engine);

A tak przy okazji to bardzo nieładnie losować cokolwiek za pomocą modulo.

0
#include <iostream>
using namespace std;

int main(int argc, char **argv){

    int min = 0;
    int max = 100;

    std::mt19937 engine(static_cast<int>(time(nulptr)));
    std::uniform_real_distribution<> distribution(min, max);
    auto random = std::bind(distribution, engine);

    cout << random;

    return 0;
}

E:\Temp\losowanie.cpp||In function 'int main(int, char**)':|
E:\Temp\losowanie.cpp|24|error: 'mt19937' is not a member of 'std'|
E:\Temp\losowanie.cpp|24|error: expected ';' before 'engine'|
E:\Temp\losowanie.cpp|25|error: 'uniform_real_distribution' is not a member of 'std'|
E:\Temp\losowanie.cpp|25|error: expected primary-expression before '>' token|
E:\Temp\losowanie.cpp|25|error: 'distribution' was not declared in this scope|
E:\Temp\losowanie.cpp|26|error: 'bind' is not a member of 'std'|
E:\Temp\losowanie.cpp|26|error: 'engine' was not declared in this scope|
||=== Build finished: 7 errors, 0 warnings ===|

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