2013-09-23 2 views
11

Я новичок в программировании.Как получить исходный код для rand() (C++)?

Я хочу точно знать, что делает rand().

Искать только в примерах использования. Но никто не объясняет каждый шаг того, как функция генерирует случайное число. Они обрабатывают rand() как черный ящик.

Я хочу знать, что делает rand(); каждый уровень.

Есть ли ресурс, который позволит мне увидеть, что делает rand()? Это все с открытым исходным кодом, не так ли? Я соглашусь на разборку, если нет источника.

Я знаю, что это возвращает случайное число, но как оно генерирует это число? Я хочу видеть каждый шаг.

спасибо.

+5

Какая система вам интересна? Есть, по-видимому, почти столько же реализаций, сколько есть среды. –

+0

У вашего компилятора может быть доступный источник библиотеки времени исполнения. Реализация, вероятно, может быть найдена там. –

+2

rand использует псевдослучайный генератор, поэтому чтение теории позади PRNG будет более информативным, чем любая часть исходного кода –

ответ

10

Это было 10 секунд: прибегая к помощи

...

Я собирался список фактический поиск, но, видя это, очевидно, простофиля, я просто голосовать, как простофиля

+1

Хорошо. Я очень новичок в программировании (~ 3 дня!), Поэтому я не знал, что искать. Я нашел реализацию, которую мне нужно изучить здесь: http://bioen.okstate.edu/Home/prashm%20-%20keep/prashant/VS.NET%20setup%20files/PROGRAM%20FILES/MICROSOFT%20VISUAL% 20STUDIO% 20.NET/VC7/CRT/SRC/RAND.C – BBedit

+0

@ user2071506 О, хорошо, я googled 'GNU libc rand', буквально. Он также получил ссылки SO. Ни одна из ссылок не была из-за пределов ~ 12 хитов. :/ – sehe

+0

@sehe 'GNU libc rand' сложно. 'sourcecode для rand() (C++)', буквально скопированный из заголовка, также дал мне хорошие результаты. –

3

Вы можете просмотреть исходный код для различных реализаций стандарта C.

вопрос есть ответ, вы можете найти то, что вы ищете в What common algorithms are used for C's rand()?

Этот ответ дает код для реализации GLibC о рандов()

14

Вот the current glibc implementation:

/* Return a random integer between 0 and RAND_MAX. */ 
int 
rand (void) 
{ 
    return (int) __random(); 
} 

Это не очень помогает, но __random в конечном итоге вызывает __random_r:

/* If we are using the trivial TYPE_0 R.N.G., just do the old linear 
    congruential bit. Otherwise, we do our fancy trinomial stuff, which is the 
    same in all the other cases due to all the global variables that have been 
    set up. The basic operation is to add the number at the rear pointer into 
    the one at the front pointer. Then both pointers are advanced to the next 
    location cyclically in the table. The value returned is the sum generated, 
    reduced to 31 bits by throwing away the "least random" low bit. 
    Note: The code takes advantage of the fact that both the front and 
    rear pointers can't wrap on the same call by not testing the rear 
    pointer if the front one has wrapped. Returns a 31-bit random number. */ 

int 
__random_r (buf, result) 
    struct random_data *buf; 
    int32_t *result; 
{ 
    int32_t *state; 

    if (buf == NULL || result == NULL) 
    goto fail; 

    state = buf->state; 

    if (buf->rand_type == TYPE_0) 
    { 
     int32_t val = state[0]; 
     val = ((state[0] * 1103515245) + 12345) & 0x7fffffff; 
     state[0] = val; 
     *result = val; 
    } 
    else 
    { 
     int32_t *fptr = buf->fptr; 
     int32_t *rptr = buf->rptr; 
     int32_t *end_ptr = buf->end_ptr; 
     int32_t val; 

     val = *fptr += *rptr; 
     /* Chucking least random bit. */ 
     *result = (val >> 1) & 0x7fffffff; 
     ++fptr; 
     if (fptr >= end_ptr) 
    { 
     fptr = state; 
     ++rptr; 
    } 
     else 
    { 
     ++rptr; 
     if (rptr >= end_ptr) 
     rptr = state; 
    } 
     buf->fptr = fptr; 
     buf->rptr = rptr; 
    } 
    return 0; 

fail: 
    __set_errno (EINVAL); 
    return -1; 
} 
1

Простейшими достаточно хорошими генераторами псевдослучайных чисел являются Linear Congruential Generators (LCGs). Эти итерации формулы, такие как

X_{n+1} = (a * X_n + c) modulo m 

константа а, с и м выбраны с заданными непредсказуемыми последовательностями. X_0 - случайное начальное значение. Существует множество других алгоритмов, но этого, вероятно, достаточно, чтобы вы начали.

Действительно хорошие генераторы псевдослучайных чисел являются более сложными, например Mersenne Twister.

+0

Уход за разъяснением -1? –

2

Я думаю, THIS - это то, что вы ищете. Он содержит подробное объяснение случайной функции и простую программу C для понимания алгоритма.

Edit:

Вы должны проверить THIS, а также. Возможный дубликат.

2

Ну, я считаю, Рэнд из стандартной библиотеки C, а не стандартной библиотеки C++. В библиотеке нет ни одной реализации, ее несколько.

Вы можете пойти где-то вроде this page, чтобы просмотреть исходный код для glibc, библиотеки c, используемой для большинства дистрибутивов Linux. Для glibc вы найдете его в исходных файлах под stdlib, таких как rand.c и random.c.

Другой вариант, такой как uClibc, может быть легче читать. Try here в папке libc/stdlib.

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