@ -30,6 +30,7 @@
# include <algorithm>
# include <cstdio>
# include <cmath>
# include <boost/archive/binary_oarchive.hpp>
# include <boost/archive/binary_iarchive.hpp>
@ -1081,7 +1082,13 @@ bool blockchain_storage::get_random_outs_for_amounts(const COMMAND_RPC_GET_RANDO
size_t try_count = 0 ;
for ( uint64_t j = 0 ; j ! = req . outs_count & & try_count < up_index_limit ; )
{
size_t i = crypto : : rand < size_t > ( ) % up_index_limit ;
// triangular distribution over [a,b) with a=0, mode c=b=up_index_limit
uint64_t r = crypto : : rand < uint64_t > ( ) % ( ( uint64_t ) 1 < < 53 ) ;
double frac = std : : sqrt ( ( double ) r / ( ( uint64_t ) 1 < < 53 ) ) ;
size_t i = ( size_t ) ( frac * up_index_limit ) ;
// just in case rounding up to 1 occurs after sqrt
if ( i = = up_index_limit )
- - i ;
if ( used . count ( i ) )
continue ;
bool added = add_out_to_get_random_outs ( amount_outs , result_outs , amount , i ) ;