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]
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]
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...
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;
}
Dzieje się tak dlatego, że losowa/100 to jest dzielenie całkowite - zmień na losowa/100.0f
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?
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.
#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 ===|