ttmath generowanie losowej liczby

0

Cześć!

Mam następujący problem. Korzystam z biblioteki ttmath. Chce wygenerować losową liczbę o określonej długości(np. 300 cyfrową). Mój pomysł to generować cyfrę z zakresu <0,9> i podstawiać je po kolei do liczby liczba[0], liczba[1] itd. ( na końcu sprawdzam jeszcze czy nie ma zera na początku ). Czy jest jakiś szybszy sposób na generowanie takiej liczby w ttmath i jeśli nie to czy ktoś wie jak zaimplementować wyżej opisany algorytm używająć ttmath?

0

Pierwszą cyfrę możesz od razu wygenerować z zakresu 1..9
Możesz generować od razu milionami, czyli po 6 cyfr naraz.

0

Najlepiej będzie sporządzić stringa z tą liczbą i stworzyć na jego podstawie bignuma. Uniknie się mnożenia, które może być kosztowne dla takich liczb.
Można też generować liczby losowe 64 bitowe przez co możemy robić to jeszcze rzadziej.
Przykładowy kod. Używam standardowego 64 bitowego merssene twistera, ale możesz skorzystać z innego (jeśli wydajność jest ważna (mt jest stosunkowo wolny) to najlepszy chyba będzie prosty xorshift, jest szybki i ma całkiem dobrą losowość, http://en.wikipedia.org/wiki/Xorshift, ale nie powinno to robić aż takiego różnicy przy tak małej ilości danych).

#include <iostream>
#include <random>
using namespace std;

int main()
{
    mt19937_64 engine(472653452); //jakis seed
    uniform_int_distribution<int64_t> distribution(0, 999999999999999999); //najwiecej co mozna wrzucic do int64_t w takiej postaci
    string bignum;
    bignum.reserve(300);
    int64_t randomNumber = 0;
    while(bignum.size() < 300)
    {
        if(randomNumber == 0) randomNumber = distribution(engine);
        bignum+='0'+randomNumber%10;
        randomNumber/=10;
    }
    cout << bignum;
    return 0;
}
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1