How to get a random element from a C++ container?

后端 未结 8 1628
礼貌的吻别
礼貌的吻别 2020-11-27 15:02

What is a good way to get a [pseudo-]random element from an STL range?

The best I can come up with is to do std::random_shuffle(c.begin(), c.end()) an

相关标签:
8条回答
  • 2020-11-27 15:36

    C++17 std::sample

    This is a convenient method to get several random elements without repetition.

    main.cpp

    #include <algorithm>
    #include <iostream>
    #include <random>
    #include <vector>
    
    int main() {
        const std::vector<int> in{1, 2, 3, 5, 7};
        std::vector<int> out;
        size_t nelems = 3;
        std::sample(
            in.begin(),
            in.end(),
            std::back_inserter(out),
            nelems,
            std::mt19937{std::random_device{}()}
        );
        for (auto i : out)
            std::cout << i << std::endl;
    }
    

    Compile and run:

    g++-7 -o main -std=c++17 -Wall -Wextra -pedantic main.cpp
    ./main
    

    Output: 3 random numbers are picked from 1, 2, 3, 5, 7 without repetition.

    For efficiency, only O(n) is guaranteed since ForwardIterator is the used API, but I think stdlib implementations will specialize to O(1) where possible (e.g. vector).

    Tested in GCC 7.2, Ubuntu 17.10. How to obtain GCC 7 in 16.04.

    0 讨论(0)
  • 2020-11-27 15:39

    You can use 0~1 random function to generate a float number for every element in the container as its score. And then select the one with highest score.

    0 讨论(0)
提交回复
热议问题