Hallo *,
vielen Dank für eure Anregungen. Ich habe mir jetzt was zusammen
gebastelt, was auch sehr performant ist. Der "Lotto" Algorithmus ist der
absolut langsamste, aber sehr gut für einen großen Zahlenbereich mit
wenigen Zufallswerten geeignet. Ich habe mich für die Lösung mit dem
Array entschieden, da sie erheblich schneller ist. Ich werde
wahrscheinlich bis an die 1.000.000 Zufallszahlen benötigen.
Damit ich den Algorithmus schnell wechseln kann und ich alle auch mal
testen kann, habe ich mein Programm so gestaltet, dass man den
Algorithmus beim Programmstart auswählen kann.
Hier ist jetzt der entscheidende Ausschnitt aus meinem Programmcode:
typedef uint64_t pkt_num_t;
bool sample( vector *samples, pkt_num_t n, pkt_num_t N )
{
// label for debug logs
string log_label = "Random generator";
struct timeval tv0, tv1;
if( debug.check( DEB_LEV_ADD ) )
gettimeofday( &tv0, NULL );
if( debug.check( DEB_LEV_INF ) ) {
stringstream N_str, n_str;
N_str << "measurement interval: " << N;
n_str << "sample size: " << n;
debug.log( log_label, N_str.str(), DEB_LEV_INF );
debug.log( log_label, n_str.str(), DEB_LEV_INF );
}
vector randoms( n, (pkt_num_t)(-1) );
// create sorted random vector with LOTTO algorithm
pkt_num_t random_count = 0;
if( rng_algo == RNG_LOTTO ) {
debug.log( log_label, "using LOTTO algorithm", DEB_LEV_INF );
for( pkt_num_t i=0; i all_randoms( N );
pkt_num_t curr_num;
pkt_num_t rand_pos;
for( pkt_num_t i=0; i all_randoms( N );
pkt_num_t rand_pos;
for( pkt_num_t i=0; iN-n; ) {
rand_pos = gsl_rng_get( rng ) % i;
randoms[N-i] = all_randoms[rand_pos];
i--;
all_randoms[rand_pos] = all_randoms[i];
}
}
// sort randoms
sort( randoms.begin(), randoms.end() );
// allocate samples
samples->assign( n, null_packet );
// copy random numbers to samples
for( pkt_num_t i=0; i