Liczba losowa - double

0

Jak wylosowac losowa liczbe typu double z danego przedzialu, przykladowo z [6.0;12.888] ?

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;
}

http://ideone.com/cjKwd2

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()));

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