2016-10-29 6 views
-7

Я использую этот код для создания; но все результаты находятся в диапазоне от 10 до 32000.генерировать случайное число от 10 до 1000000000 в C

Можете ли вы сказать мне, что я делаю неправильно?

for (i = 0; i < N; i++) { 
    *(A + i) = rand() % (1000000000 - 10 + 1) + 10; 
    printf("%lu\n", *(A + i)); 
} 
+1

Что такое тип данных 'i'? –

+1

То, что вы делаете неправильно, не читает документацию 'rand': https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm –

+0

Hi Eli; i - int. – mfd

ответ

1

rand() возвращает значение в диапазоне от 0 до RAND_MAX (который, в соответствии со стандартом, по меньшей мере, 32767): https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm

Если вы хотите более высокое значение, которое можно умножить несколько рандов() Результаты.

+2

Лучше сдвинуть и ИЛИ для большего диапазона, чем 'RAND_MAX'. –

+0

'RAND_MAX' может быть размером 32767; он может быть больше, в зависимости от вашей системы. Стандарт определяет только минимум. – rici

+0

@rici спасибо, я отредактировал свой ответ. – obe

0

Вот что документация говорит о RAND() Возвращаемое значение:

An integer value between 0 and RAND_MAX. 

А вот что документация говорит о RAND_MAX:

This value is library-dependent, but is guaranteed to be at least 32767 on any standard library implementation. 

Так что в вашей реализации RAND_MAX, вероятно, может генерировать числа до 32767. Вероятно, вам необходимо генерировать верхний и нижний бит независимо друг от друга:

int big_rand() 
{ 
    return rand() | (rand() << 15); 
} 
+0

Вы должны замаскировать верхние биты только для того, чтобы быть уверенными и получить лучшие результаты. – Rasty

+0

При объединении случайных бит лучше '' '' '' ''. Это важно, в общем, как «rand() | (rand() << 15) 'полагается на' RAND_MAX == 32767', а C указывает, что только как _minimum_. – chux

1

1 000 000 000 (3B9ACA00) - это 30-разрядное число.

rand() дает результаты в диапазоне [0...RAND_MAX]. RAND_MAX может быть как 32 767, 15-разрядное число // RAND_MAX может быть размером INT_MAX. При вызове RAND_MAX < (1000000000 - 10 + 1) требуется несколько вызовов rand(), количество различных значений, запрашиваемых OP.

Ниже выбрасываются небольшие или большие значения (около 7% от времени) и повторы попытки. Это делается для поддержания справедливого распределения чисел.

uint32_t rand_10_to_1000000000(void) { 
    // This method only works well when RAND_MAX is 2**n -1. 
    // This is commonly true 
    assert((RAND_MAX + (uint32_t) 1) & RAND_MAX == 0); 

    uint32_t r; 
    do { 
    r = rand(); 
    #if RAND_MAX < 0x3FFFFFFF 
     // Adding 1 to RAND_MAX as an int should be avoided to prevent int overflow. 
     r *= RAND_MAX + (uint32_t) 1; 
     r += rand(); 
    #endif 
    r &= 0x3FFFFFFF; // only use lower 30 bits. 
    } while (r < 10 || r > 1000000000); 
    return r; 
} 
0

Внедрение системы rand() имеет ограниченную точность. Стандарт устанавливает, что RAND_MAX должно быть не менее 32767. Кажется, вы используете это минимальное значение.

Вы можете объединить несколько случайных значений, чтобы вычислить ваши образцы:

for (i = 0; i < N; i++) {     
    A[i] = 10 + (rand() | ((unsigned)rand() << 15)) % (1000000000 - 10 + 1); 
    printf("%lu\n", A[i]); 
} 

PS: почему вы пишете *(A+i) вместо более читаемым A[i]?

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