add ranged uniform int sequence

This commit is contained in:
方而静 2023-07-18 20:04:28 +08:00
parent 63d21bcb1f
commit c4666278c8
2 changed files with 22 additions and 3 deletions

View File

@ -0,0 +1,8 @@
#include "../vmake.hpp"
#include <vector>
using namespace std;
int main() {
vmake::output(cout, " ", vmake::take(vmake::rng::uniform_ints(1, 10), 10));
return 0;
}

View File

@ -232,7 +232,7 @@ struct limitor {
limitor(const limitor<Gen> &g) = default;
bool is_terminated() const noexcept {
return lim <= 0;
return lim <= 0 || g.is_terminated();
}
auto operator()() {
@ -361,10 +361,14 @@ inline filteror<typename std::decay<Gen>::type, typename std::decay<Pred>::type>
namespace rng {
inline auto make_seed() {
// NOTE: MinGW GCC older than 9.2 have a fixed random_device
return std::random_device{}();
}
template<typename Engine = std::default_random_engine>
inline auto common() {
// NOTE: MinGW GCC older than 9.2 have a fixed random_device
return make_generator<Engine>(std::random_device{}());
return make_generator<Engine>(make_seed());
}
template<typename Engine, typename Seed>
@ -400,6 +404,13 @@ inline auto cstyle(int seed) {
return details::cstyle_rng();
}
template<typename Tval = int, typename Engine = std::default_random_engine>
inline auto uniform_ints(Tval l, Tval r) {
return generate([rng = Engine(), dis = std::uniform_int_distribution<Tval>(l, r)]() mutable {
return dis(rng);
});
}
}
template<typename OutputIt, typename Gen>