0

I have same problem as here Distributed probability random number generator but in c++. I know how to implement it but my question is - Is that functionaly build in current version of c++?

Community
  • 1
  • 1
Houp
  • 101
  • 4
  • There ought to be something here for you: http://en.cppreference.com/w/cpp/numeric/random – jrok Feb 23 '13 at 10:54
  • 3
    http://en.cppreference.com/w/cpp/numeric/random/discrete_distribution thats it! Why I haven't seen it for the first time? Ok, thanks. Your answer helped me. – Houp Feb 23 '13 at 10:58
  • And unfortunatelly Visual Studio doesnt support constructor with iterators. ( dist(someVector.begin(), someVector.end() ) :( – Houp Feb 23 '13 at 11:19
  • @user1483399 Does it support the constructor with an `initializer_list`? `dist({150, 40, 15, 3})`? – Joseph Mansfield Feb 23 '13 at 11:21
  • No, it doesn't work. See http://msdn.microsoft.com/cs-cz/library/ee462326%28v=vs.100%29.aspx . Maybe piecewise_constant_distribution could be used instead discrete_distribution. – Houp Feb 23 '13 at 11:56

1 Answers1

3

For completeness, I'll answer the question.

This distribution can be produced using C++11's random number generation library. This first requires seeding a random number engine (here I use std::mt19937) and then using that engine with a std::discrete_distribution random number distribution.

std::discrete_dstribution's constructor takes either an iterator range over a sequence of weights or an initializer_list of weights. The generated numbers are then weighted according to the corresponding index in the sequence of weights. That is, if {10, 5, 1} are the weights, 0 will be produced with 10/(10 + 5 + 1) = 0.625 probability, and so on.

The following code demonstrates a solution to the other question:

std::random_device device;
std::mt19937 engine(device()); // Seed the random number engine
std::discrete_distribution<> dist({150, 40, 15, 3}); // Create the distribution

// Now generate values with:
std::cout << (dist(engine) + 1) << std::endl;
Joseph Mansfield
  • 108,238
  • 20
  • 242
  • 324