Skip to content

rnd.hpp

#include "noya/rnd.hpp"

View on GitHub

#ifndef NOYA_RANDOM_HPP
#define NOYA_RANDOM_HPP 1
#include <algorithm>
#include <ctime>
#include <numeric>
#include <random>
#include <vector>

namespace noya {
using ull = unsigned long long;
namespace internal {
inline std::mt19937_64 &gen_values() {
  static std::mt19937_64 gen(time(0));
  return gen;
}
} // namespace internal

inline std::vector<int> random_permutation(int N) {
  std::vector<int> p(N);
  std::iota(p.begin(), p.end(), 0);
  std::shuffle(p.begin(), p.end(), internal::gen_values());
  return p;
}
inline std::vector<ull> random_hash_values(int N) {
  std::vector<ull> X(N);
  std::generate(X.begin(), X.end(), internal::gen_values());
  return X;
}
inline std::vector<std::vector<int>> random_tree(int N) {
  std::vector<std::vector<int>> g(N);
  for (int i = 1; i < N; i++) {
    int p = internal::gen_values()() % i;
    g[p].push_back(i);
  }
  return g;
}
} // namespace noya

#endif // NOYA_RANDOM_HPP
#include <algorithm>
#include <ctime>
#include <numeric>
#include <random>
#include <vector>

namespace noya {
using ull = unsigned long long;
namespace internal {
inline std::mt19937_64 &gen_values() {
  static std::mt19937_64 gen(time(0));
  return gen;
}
} // namespace internal

inline std::vector<int> random_permutation(int N) {
  std::vector<int> p(N);
  std::iota(p.begin(), p.end(), 0);
  std::shuffle(p.begin(), p.end(), internal::gen_values());
  return p;
}
inline std::vector<ull> random_hash_values(int N) {
  std::vector<ull> X(N);
  std::generate(X.begin(), X.end(), internal::gen_values());
  return X;
}
inline std::vector<std::vector<int>> random_tree(int N) {
  std::vector<std::vector<int>> g(N);
  for (int i = 1; i < N; i++) {
    int p = internal::gen_values()() % i;
    g[p].push_back(i);
  }
  return g;
}
} // namespace noya