c++ - 範囲 - 乱数生成 アルゴリズム




rand()(C++)のソースコードはどうやって入手できますか? (4)

私はプログラミングが初めてです。

私はrand()が何をするのか正確に知りたいのです。

検索すると、その使用法に関する例しか得られません。 しかし、関数がどのように乱数を生成するかの各ステップを説明するものは誰もいません。 彼らはrand()をブラックボックスとして扱います。

rand()が何をしているのか知りたいのですが。 各ステップ

rand()が何をするのかを正確に知ることができるリソースはありますか? これはすべてオープンソースのものですね。 情報源がなければ、私は逆アセンブルを解決します。

私はそれが乱数を返すことを知っています、しかしそれはどのようにその数を生成しますか? 各ステップを見たいです。

ありがとうございました。



これが現在のglibcの実装です。

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

これはあまり役に立ちませんが、 __random最終的に__random_r呼び出し__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;
}


そうですね、randはC ++標準ライブラリからではなく、C標準ライブラリからのものだと思います。 どちらのライブラリの実装もありません。いくつかあります。

ほとんどのLinuxディストリビューションで使用されているcライブラリであるglibcのソースコードを表示するには、 このページのどこかにアクセスしてください 。 glibcの場合は、 rand.crandom.cなどのstdlibの下のソースファイルで見つけることができます。

uClibcのような異なる実装は読みやすいかもしれません。 libc / stdlibフォルダーの下で試してください





random