Jak wylosowac losowa liczbe typu double z danego przedzialu, przykladowo z [6.0;12.888] ?
0
0
Wystarczy chwilę poszukać albo pomyśleć:
double fRand(double fMin, double fMax)
{
double f = (double)rand() / RAND_MAX;
return fMin + f * (fMax - fMin);
}
// stackoverflow.com
0
agilob@Asus-PC:~> cat rand.cpp
#include <cstdlib>
#include <iostream>
int main(){
int min = 10, //zakres
max = 20; //losowania
double randy = min + (double) rand() / ((double) RAND_MAX / (max-min));
std::cout << randy << std::endl;
return 0;
}
3
C++11:
#include <iostream>
#include <random>
#include <functional>
#include <algorithm>
#include <iterator>
#include <ctime>
int main() {
// Limity
double min = 6.0;
double max = 12.888;
// Generator liczb.
std::mt19937 engine(std::time(nullptr));
// Żądany rozkład.
std::uniform_real_distribution<> dist(min, max);
// Żeby było prościej.
auto gen = std::bind(dist, engine);
// 10 liczb.
std::generate_n(std::ostream_iterator<double>(std::cout, " "), 10, gen);
return 0;
}
3
Można również skorzystać z std::random_device
. W zależności od implementacji biblioteki standardowej oraz systemu poda nam możliwie niedeterministyczne liczby (na Windows będzie to wywołanie RtlGenRandom(), które swoją entropię bierze z wielu źródeł: http://en.wikipedia.org/wiki/CryptGenRandom#Method_of_operation).
std::random_device random_device;
Jako generator liczb:
auto generator = std::bind(dist, std::ref(random_device));
Jako ziarno dla Mersenne Twister (gdy potrzebujemy dużo liczb w możliwie krótkim czasie):
auto generator = std::bind(dist, std::mt19937(random_device()));