2015-06-19 3 views
0

Я пытаюсь создать огромное случайное число в C++, используя библиотеку GMP, но у меня возникают проблемы с выяснением синтаксиса. Это немного отличается от других примеров, которые я нашел, потому что мне нужно установить пол и потолок для случайного числа между ними. Это своего рода то, что мне нужно сделать:C++ GMP Генерация случайного числа

mpz_class high, low; 

low = pow(2,199); 
high = pow(2,210); 

// code to use the high and low numbers to generate the random number 

Я знаю, что это не так много, чтобы идти дальше, но опять же, я не уверен, что синтаксис будет даже в этот момент, я пытался несколько вещи, но ничего, что я нашел, позволяет мне сказать GMP использовать высокий и низкий диапазон для генерации чисел.

Мысли?

+0

Я не против переключения библиотек на что-то вроде TTMath, я просто выбрал GMP, потому что я хорошо читал об этом. – sadmicrowave

+0

Итак, в основном, код, который вы показываете, не имеет значения, и вы хотите знать, есть ли метод в gmp, который позволяет генерировать случайные числа в определенном диапазоне? – stefan

+0

Ха, да. это правильно. – sadmicrowave

ответ

3

От Gmp Lib Documentation

Функция: пустот mpz_urandomb (mpz_t ROP, gmp_randstate_t состояния, mp_bitcnt_t п)

Генерировать равномерно распределенное случайное число в диапазоне от 0 до 2^п-1 включительно

Итак, возьмите 210 - 199 и используйте это как n, сгенерируйте случайное число и добавьте результат в pow (2,199).

Если вам нужно что-то более зернистое, чем сила 2 верхнего предела, это не сработает для вас. Вы можете попробовать неподписанных Int размера случайную функцию, используя ту же технику выше:

- Функция: неподписанных долгое gmp_urandomm_ui (gmp_randstate_t состояние, без знака долго п)

Возврат равномерно распределены случайное число в диапазоне от 0 до n-1, включительно.

Здесь вы найдете свой гранулированный диапазон и используйте это для n. Затем добавьте случайное число к вашему более низкому значению. Ограничение п должно быть меньше, чем MAXUINT, как правило, 2^32 -1

+2

Чтобы создать число от 0 до n, вы можете сгенерировать число меньше 2^k (которое больше n), а если число больше n, попробуйте еще раз, пока оно не станет достаточно маленьким. –

+0

@MarcGlisse хорошая точка - но не зная теорию случайных чисел, результат кажется несколько омраченным, кроме того, что он принимает неопределенное количество циклов, чтобы получить результат, все равно +1 – Les

+0

Хорошо, я получил числа, которые будут сгенерированы, но это не так. По-видимому, я могу выполнять основные математические операции в переменной типа «mpz_t». Я получаю следующее при добавлении результата обратно в 'mpz_ui_pow_ui (высокий, 2,199)': 'недопустимые операнды для двоичного выражения ('__mpz_struct *' и '__mpz_struct *') frand = rand + low;' – sadmicrowave

3

Используя логику, представленную @Less, я написал следующее, чтобы решить мою проблему:

void 
makeprime() 
{ 
    // *********************** VARIABLE DECLARATION *********************** // 
    // initilize the variables as gmp class instances 
    mpz_t l, rand; 
    unsigned long seed; 
    // perform inits to create variable pointers with 0 value 
    mpz_inits(l, rand); 
    //mpz_init(rand); 

    // calculate the random number floor 
    mpz_ui_pow_ui(l, 2, 199); 

    // initilze the state object for the random generator functions 
    gmp_randstate_t rstate; 
    // initialize state for a Mersenne Twister algorithm. This algorithm is fast and has good randomness properties. 
    gmp_randinit_mt(rstate); 

    // create the generator seed for the random engine to reference 
    gmp_randseed_ui(rstate, seed); 

    /* 
    Function: 
    int mpz_probab_prime_p (const mpz_t n, int reps) 

    Determine whether n is prime. Return 2 if n is definitely prime, return 1 if n is probably prime (without being certain), 
    or return 0 if n is definitely composite. 
    */ 
    do { 
     // return a uniformly distributed random number in the range 0 to n-1, inclusive. 
     mpz_urandomb(rand, rstate, 310); 

     // add the random number to the low number, which will make sure the random number is between the low and high ranges 
     mpz_add(rand, rand, l); 

     gmp_printf("randomly generated number: %Zd\n", rand); 

    } while (!(mpz_probab_prime_p(rand, 25)));   

    // *********************** GARBAGE COLLECTION *********************** // 
    // empty the memory location for the random generator state 
    gmp_randclear(rstate); 
    // clear the memory locations for the variables used to avoid leaks 
    mpz_clear(l); 
    mpz_clear(rand); 
} 

Благодаря @Less для вашей логики и помогите!

Смежные вопросы