random function in C++

╄→гoц情女王★ 提交于 2021-02-08 02:56:52

问题


Is there a function that generates k random numbers within a specified range. For example I want 5 random numbers between 0 to 100, with or without replacement.


回答1:


You could use std::generate_n with either rand() or a generator from the new C++11 random number generators.




回答2:


There is the Boost library, which you can use to generate random numbers, for example. The following code generates 5 random numbers from [0, 100] with replacement:

#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>

const int numWantedNumbers = 5;

int main()
{
    boost::random::mt19937 generator;
    boost::random::uniform_int_distribution<> distribution(0, 100);
    std::vector<int> result;
    for (int i = 0; i < numWantedNumbers; ++i)
        result.push_back(distribution(generator));
}

If you want to generate the numbers without replacement, simply check if they are still available:

#include <algorithm>
#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>

const int numWantedNumbers = 5;

int main()
{
    boost::random::mt19937 generator;
    boost::random::uniform_int_distribution<> distribution(0, 100);
    std::vector<int> result;
    while (result.size() < numWantedNumbers)
    {
        int number = distribution(generator);
        if (std::find(result.begin(), result.end(), number) == result.end())
            result.push_back(number);
    }
}

Note: The rejection sampling in the example without replacement has the obvious drawback that longer vectors are quite difficult to create. Just try to draw 99 out of 100 numbers, to see what I mean (or even better draw 9999 out of 10000). If this is a problem, I would suggest to create a random permutation of all possible numbers and then cut the vector at the requested size:

#include <algorithm>
#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>

const int numWantedNumbers = 5;

int main()
{
    boost::random::mt19937 generator;
    boost::random::uniform_int_distribution<> distribution(0, 100);

    // Generate a vector with all possible numbers and shuffle it.
    std::vector<int> result;
    for (int i = 0; i <= 100; ++i)
        result.push_back(i);
    for (int i = 0; i <= 100; ++i)
    {
        int x = distribution(generator);
        std::swap(result[i], result[x]);
    }

    // Truncate to the requested size.
    result.resize(numWantedNumbers);
}

Edit based on suggestion by juanchopanza:

In C++11 manner, the last variant would look like this

#include <algorithm>
#include <random>
#include <vector>

const int numWantedNumbers = 5;

int main()
{
    std::random_device device;
    std::mt19937 generator(device());
    std::uniform_int_distribution<> distribution(0, 100);

    // Generate a vector with all possible numbers and shuffle it.
    std::vector<int> result;
    for (int i = 0; i <= 100; ++i)
        result.push_back(i);
    std::random_shuffle(result.begin(), result.end());

    // Truncate to the requested size.
    result.resize(numWantedNumbers);
}

g++-4.6 compiles it happily, if you add the -std=c++0x switch.

Edit: Make use of std::random_shuffle() (tanks to James Kanze).




回答3:


Yes there is a rand() function in C++ which can be used including cstdlib header file in your program. You can implement your program using the following code.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
  int max {100};
  int min {0};
  int number;
  int count = 5; //assuming that only 10 numbers we need to print
  srand(time(0));
  for(int i=1;i<=count;i++)
  {
      number = rand() % (max - min +1) + min;``
      cout<<number<<endl;
  }
}


来源:https://stackoverflow.com/questions/12182441/random-function-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!