ヒューリスティックコンテストにおける小手先のテクニックを自分用にまとめたもの。
汎用的な手法というよりは細かい高速化テクニックが多め。
あくまで備忘録なので説明は少なめかつ順番は適当。
出典があるものはリンクで代用。
怪しい記述があれば@ethylene_66までご連絡いただければ幸いです。
xorshiftですら遅い時はpcgかlcg←自分でベンチマークを取ったわけではないので怪しいかも
[0, n) から整数を一様サンプリングするには (rand32()*n)>>32
bool乱数の高速化
template <auto P>
inline bool bool_random() {
return uint_random() < (P * 4294967296);
}
constexpr int LOG_TABLE_SIZE = 1<<20;
double log_table[LOG_TABLE_SIZE];
double log_table_stable[LOG_TABLE_SIZE];
void init_log_table() {
for (int i = 0; i < LOG_TABLE_SIZE; i++) {
double x = ((double)i + 0.5) / LOG_TABLE_SIZE;
log_table[i] = log(x);
log_table_stable[i] = log_table[i];
}
// shuffle
for (int i = 1; i < LOG_TABLE_SIZE; i++) {
int j = rng.range_random_safe(LOG_TABLE_SIZE);
swap(log_table[i], log_table[j]);
}
}
inline double log_random() {
static int idx = 0;
if (idx == LOG_TABLE_SIZE)
idx = 0;
return log_table[idx++];
}