Commit c19eb587 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Add command line parameter to set the random seed.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent a896c01d
...@@ -28,6 +28,7 @@ namespace Params ...@@ -28,6 +28,7 @@ namespace Params
static double water_delta = 0.015; // strength of the watermark static double water_delta = 0.015; // strength of the watermark
static double pre_scale = 0.95; // rescale the signal to avoid clipping after watermark is added static double pre_scale = 0.95; // rescale the signal to avoid clipping after watermark is added
static bool shuffle = false; static bool shuffle = false;
static unsigned int seed = 0;
} }
void void
...@@ -145,6 +146,10 @@ parse_options (int *argc_p, ...@@ -145,6 +146,10 @@ parse_options (int *argc_p,
{ {
Params::shuffle = true; Params::shuffle = true;
} }
else if (check_arg (argc, argv, &i, "--seed", &opt_arg))
{
Params::seed = atoi (opt_arg);
}
else if (check_arg (argc, argv, &i, "--water-delta", &opt_arg)) else if (check_arg (argc, argv, &i, "--water-delta", &opt_arg))
{ {
Params::water_delta = atof (opt_arg); Params::water_delta = atof (opt_arg);
...@@ -227,14 +232,22 @@ get_frame (WavData& wav_data, int f, int ch) ...@@ -227,14 +232,22 @@ get_frame (WavData& wav_data, int f, int ch)
return result; return result;
} }
std::mt19937_64
init_rng (uint64_t seed)
{
const uint64_t prime = 3126986573;
std::mt19937_64 rng;
rng.seed (seed + prime * Params::seed);
return rng;
}
void void
get_up_down (int f, vector<int>& up, vector<int>& down) get_up_down (int f, vector<int>& up, vector<int>& down)
{ {
vector<int> used (Params::frame_size / 2); vector<int> used (Params::frame_size / 2);
std::mt19937_64 rng; std::mt19937_64 rng = init_rng (f); // use per frame random seed, may want to have cryptographically secure algorithm
// use per frame random seed, may want to have cryptographically secure algorithm
rng.seed (f);
auto choose_bands = [&used, &rng] (vector<int>& bands) { auto choose_bands = [&used, &rng] (vector<int>& bands) {
while (bands.size() < Params::bands_per_frame) while (bands.size() < Params::bands_per_frame)
...@@ -256,9 +269,7 @@ gen_shuffle (size_t size, int seed) ...@@ -256,9 +269,7 @@ gen_shuffle (size_t size, int seed)
{ {
vector<int> result (size); vector<int> result (size);
std::mt19937_64 rng; std::mt19937_64 rng = init_rng (seed); // should use cryptographically secure generator, properly seeded
// should use cryptographically secure generator, properly seeded
rng.seed (seed);
for (size_t i = 0; i < result.size(); i++) for (size_t i = 0; i < result.size(); i++)
result[i] = i; result[i] = i;
......
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