diff --git a/src/data/pack.cpp b/src/data/pack.cpp index 9c1b005f..0e94314f 100644 --- a/src/data/pack.cpp +++ b/src/data/pack.cpp @@ -179,14 +179,6 @@ void PackInstance::request_copy(size_t copies) { requested_copies += copies; } -/// Random generator with random numbers in a range -template -struct RandomRange { - RandomRange(Gen& gen) : gen(gen) {} - unsigned operator () (unsigned max) { return gen() % max; } - Gen& gen; -}; - struct WeightedItem { double weight; int count; @@ -248,11 +240,10 @@ void PackInstance::generate(vector* out) { // NOTE: there is no way to pick items without replacement if (out && !cards.empty()) { // to prevent us from being too predictable for small sets, periodically reshuffle - RandomRange gen_range(parent.gen); int max_per_batch = ((int)cards.size() + 1) / 2; int rem = (int)requested_copies; while (rem > 0) { - random_shuffle(cards.begin(), cards.end(), gen_range); + shuffle(cards.begin(), cards.end(), parent.gen); out->insert(out->end(), cards.begin(), cards.begin() + min(rem, max_per_batch)); rem -= max_per_batch; } diff --git a/src/script/functions/basic.cpp b/src/script/functions/basic.cpp index d3d457d3..729db61f 100644 --- a/src/script/functions/basic.cpp +++ b/src/script/functions/basic.cpp @@ -16,6 +16,7 @@ #include #include #include +#include DECLARE_TYPEOF_COLLECTION(pair); @@ -595,6 +596,12 @@ SCRIPT_FUNCTION(sort_list) { return sort_script(ctx, input, *order_by, remove_duplicates); } +template +void shuffle(It begin, It end) { + std::random_device rng; + std::mt19937 urng(rng()); + std::shuffle(begin, end, urng); +} SCRIPT_FUNCTION(random_shuffle) { SCRIPT_PARAM_C(ScriptValueP, input); @@ -605,7 +612,7 @@ SCRIPT_FUNCTION(random_shuffle) { ret->value.push_back(v); } // shuffle - random_shuffle(ret->value.begin(), ret->value.end()); + shuffle(ret->value.begin(), ret->value.end()); return ret; } @@ -643,7 +650,7 @@ SCRIPT_FUNCTION(random_select_many) { while (ScriptValueP v = it->next()) { ret->value.push_back(v); } - random_shuffle(ret->value.begin(), ret->value.end()); + shuffle(ret->value.begin(), ret->value.end()); // keep only the first 'count' ret->value.resize(count); }