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;
}