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

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

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

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

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

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

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

спасибо.

6 ответов


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

...

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


здесь текущая реализация 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;
}

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

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

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


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

Edit:

вы должны проверить этой Как хорошо. Возможный дубликат.


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

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

другая реализация, такая как uClibc, может быть легче читать. попробовать вот!--6--> в папке libc/stdlib.


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

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

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

действительно хорошие генераторы псевдослучайных чисел более сложны, такие как Мерсенна Твистер!--3-->.