Подтвердить что ты не робот

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

Я новичок в программировании.

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

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

Это было 10 секунд поиска:

...

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

Ответ 2

Вот текущая реализация glibc:

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

Ответ 3

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

Ранее был задан вопрос, вы можете найти то, что ищете, Какие общие алгоритмы используются для rand()?

Этот ответ предоставляет код для реализации glibc rand()

Ответ 4

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

Edit:

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

Ответ 5

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

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

Другую реализацию, такую ​​как uClibc, легче читать. Попробуйте здесь в папке libc/stdlib.

Ответ 6

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

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

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

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