integrate rng for winner tickets

This commit is contained in:
sierra19XX 2020-11-02 12:07:30 +00:00
parent 5ee3cba043
commit b28f0556f8
5 changed files with 38 additions and 31 deletions

View file

@ -3200,34 +3200,7 @@ vector<uint64_t> database_api::get_random_number_ex(uint64_t minimum, uint64_t m
vector<uint64_t> database_api_impl::get_random_number_ex(uint64_t minimum, uint64_t maximum, uint64_t selections, bool duplicates) const
{
FC_ASSERT( selections <= 100000 );
if (duplicates == false) {
FC_ASSERT( maximum - minimum >= selections );
}
vector<uint64_t> v;
v.reserve(selections);
if (duplicates) {
for (uint64_t i = 0; i < selections; i++) {
int64_t rnd = _db.get_random_bits(maximum - minimum) + minimum;
v.push_back(rnd);
}
} else {
vector<uint64_t> tmpv;
tmpv.reserve(selections);
for (uint64_t i = minimum; i < maximum; i++) {
tmpv.push_back(i);
}
for (uint64_t i = 0; (i < selections) && (tmpv.size() > 0); i++) {
uint64_t idx = _db.get_random_bits(tmpv.size());
v.push_back(tmpv.at(idx));
tmpv.erase(tmpv.begin() + idx);
}
}
return v;
return _db.get_random_numbers(minimum, maximum, selections, duplicates);
}
uint64_t database_api::get_random_number(uint64_t bound) const

View file

@ -934,7 +934,7 @@ class database_api
// ACCOUNT ROLE //
//////////////////
vector<account_role_object> get_account_roles_by_owner(account_id_type owner) const;
private:
/////////////////////////////
// Random number generator //
/////////////////////////////

View file

@ -315,4 +315,36 @@ bool database::is_son_active( son_id_type son_id )
return (it_son != active_son_ids.end());
}
vector<uint64_t> database::get_random_numbers(uint64_t minimum, uint64_t maximum, uint64_t selections, bool duplicates)
{
FC_ASSERT( selections <= 100000 );
if (duplicates == false) {
FC_ASSERT( maximum - minimum >= selections );
}
vector<uint64_t> v;
v.reserve(selections);
if (duplicates) {
for (uint64_t i = 0; i < selections; i++) {
int64_t rnd = get_random_bits(maximum - minimum) + minimum;
v.push_back(rnd);
}
} else {
vector<uint64_t> tmpv;
tmpv.reserve(selections);
for (uint64_t i = minimum; i < maximum; i++) {
tmpv.push_back(i);
}
for (uint64_t i = 0; (i < selections) && (tmpv.size() > 0); i++) {
uint64_t idx = get_random_bits(tmpv.size());
v.push_back(tmpv.at(idx));
tmpv.erase(tmpv.begin() + idx);
}
}
return v;
}
} }

View file

@ -325,6 +325,7 @@ namespace graphene { namespace chain {
uint32_t last_non_undoable_block_num() const;
vector<authority> get_account_custom_authorities(account_id_type account, const operation& op)const;
vector<uint64_t> get_random_numbers(uint64_t minimum, uint64_t maximum, uint64_t selections, bool duplicates);
//////////////////// db_init.cpp ////////////////////
void initialize_evaluators();

View file

@ -89,7 +89,8 @@ namespace graphene
structurized_participants.emplace(holder, vector<uint16_t>());
}
uint64_t jackpot = get_lottery_jackpot(db).amount.value;
auto winner_numbers = db.get_winner_numbers(id, holders.size(), lottery_options.winning_tickets.size());
auto selections = lottery_options.winning_tickets.size() <= holders.size() ? lottery_options.winning_tickets.size() : holders.size();
auto winner_numbers = db.get_random_numbers(0, holders.size(), selections, false);
auto &tickets(lottery_options.winning_tickets);
@ -167,4 +168,4 @@ namespace graphene
db.apply_operation(eval, end_op);
}
} // namespace chain
} // namespace graphene
} // namespace graphene