Commit e10b3b31 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Move shuffle() function to Random class.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent e585040c
key:
- avoid reroll in up_down generation
- move shuffle function to Random class
possible improvements:
- dynamic bit strength
......
......@@ -274,19 +274,6 @@ get_up_down (int f, vector<int>& up, vector<int>& down)
choose_bands (down);
}
template<class T> void
gen_shuffle (vector<T>& result, int seed, Random::Stream stream)
{
Random rng (seed, stream);
// Fisher–Yates shuffle
for (size_t i = 0; i < result.size() - 1; i++)
{
size_t j = i + rng() % (result.size() - i);
std::swap (result[i], result[j]);
}
}
template<class T> vector<T>
randomize_bit_order (const vector<T>& bit_vec, bool encode)
{
......@@ -295,7 +282,8 @@ randomize_bit_order (const vector<T>& bit_vec, bool encode)
for (size_t i = 0; i < bit_vec.size(); i++)
order.push_back (i);
gen_shuffle (order, /* seed */ 0, Random::Stream::bit_order);
Random random (/* seed */ 0, Random::Stream::bit_order);
random.shuffle (order);
vector<T> out_bits (bit_vec.size());
for (size_t i = 0; i < bit_vec.size(); i++)
......@@ -330,7 +318,9 @@ gen_mix_entries (int block)
for (size_t i = 0; i < up.size(); i++)
mix_entries.push_back ({ f, up[i], down[i] });
}
gen_shuffle (mix_entries, /* seed */ block, Random::Stream::mix);
Random random (/* seed */ block, Random::Stream::mix);
random.shuffle (mix_entries);
return mix_entries;
}
......
......@@ -37,6 +37,19 @@ public:
}
void refill_buffer();
template<class T> void
shuffle (std::vector<T>& result)
{
// Fisher–Yates shuffle
for (size_t i = 0; i < result.size(); i++)
{
const uint64_t random_number = (*this)();
size_t j = i + random_number % (result.size() - i);
std::swap (result[i], result[j]);
}
}
static void set_global_test_key (uint64_t seed);
static void load_global_key (const std::string& key_file);
static std::string gen_key();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment