integrate rng for winner tickets
This commit is contained in:
parent
5ee3cba043
commit
b28f0556f8
5 changed files with 38 additions and 31 deletions
|
|
@ -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
|
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 );
|
return _db.get_random_numbers(minimum, maximum, selections, duplicates);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t database_api::get_random_number(uint64_t bound) const
|
uint64_t database_api::get_random_number(uint64_t bound) const
|
||||||
|
|
|
||||||
|
|
@ -934,7 +934,7 @@ class database_api
|
||||||
// ACCOUNT ROLE //
|
// ACCOUNT ROLE //
|
||||||
//////////////////
|
//////////////////
|
||||||
vector<account_role_object> get_account_roles_by_owner(account_id_type owner) const;
|
vector<account_role_object> get_account_roles_by_owner(account_id_type owner) const;
|
||||||
private:
|
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
// Random number generator //
|
// Random number generator //
|
||||||
/////////////////////////////
|
/////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -315,4 +315,36 @@ bool database::is_son_active( son_id_type son_id )
|
||||||
return (it_son != active_son_ids.end());
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
} }
|
} }
|
||||||
|
|
|
||||||
|
|
@ -325,6 +325,7 @@ namespace graphene { namespace chain {
|
||||||
|
|
||||||
uint32_t last_non_undoable_block_num() const;
|
uint32_t last_non_undoable_block_num() const;
|
||||||
vector<authority> get_account_custom_authorities(account_id_type account, const operation& op)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 ////////////////////
|
//////////////////// db_init.cpp ////////////////////
|
||||||
|
|
||||||
void initialize_evaluators();
|
void initialize_evaluators();
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,8 @@ namespace graphene
|
||||||
structurized_participants.emplace(holder, vector<uint16_t>());
|
structurized_participants.emplace(holder, vector<uint16_t>());
|
||||||
}
|
}
|
||||||
uint64_t jackpot = get_lottery_jackpot(db).amount.value;
|
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);
|
auto &tickets(lottery_options.winning_tickets);
|
||||||
|
|
||||||
|
|
@ -167,4 +168,4 @@ namespace graphene
|
||||||
db.apply_operation(eval, end_op);
|
db.apply_operation(eval, end_op);
|
||||||
}
|
}
|
||||||
} // namespace chain
|
} // namespace chain
|
||||||
} // namespace graphene
|
} // namespace graphene
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue