Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I get the sourcecode for rand() (C++)?

Tags:

c++

random

I'm new to programming.

I want to know exactly what rand() does.

Searching only yields examples on its usage. But none explain each step of how the function generates a random number. They treat rand() as a blackbox.

I want to know what rand() is doing; each step.

Is there a resource that will allow me to see exactly what rand() does? This is all open source stuff isn't it? I'll settle for the disassembly, if there's no source.

I know it returns a random number, but how does it generate that number? I want to see each step.

Thank you.

like image 533
BBedit Avatar asked Sep 23 '13 22:09

BBedit


People also ask

How does the rand () function work in C?

DESCRIPTION The rand() function returns a pseudo-random integer in the range 0 to RAND_MAX inclusive (i.e., the mathematical range [0, RAND_MAX]). The srand() function sets its argument as the seed for a new sequence of pseudo-random integers to be returned by rand().

What is the range of rand () in C?

The C library function int rand(void) returns a pseudo-random number in the range of 0 to RAND_MAX. RAND_MAX is a constant whose default value may vary between implementations but it is granted to be at least 32767.

What is the return type of rand () function?

RAND returns an evenly distributed random real number greater than or equal to 0 and less than 1.

What is the header file for rand?

A call to the rand() function (header file stdlib. h), with no arguments, returns a fairly good approximation to a random integer in the range 0 to RAND_MAX (defined in stdlib. h). The srand() function sets its argument, which is of type int, as the seed for a new sequence of numbers to be returned by rand().


2 Answers

Here is the current glibc implementation:

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

That's not much help, but __random eventually calls __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;
}
like image 166
Carl Norum Avatar answered Oct 25 '22 17:10

Carl Norum


This was 10 seconds of googling:

  • gcc implementation of rand()
  • How is the rand()/srand() function implemented in C
  • implementation of rand()

...

  • http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a01206.html
  • http://www.gnu.org/software/libc/manual/html_node/Pseudo_002dRandom-Numbers.html

I was gonna list the actual search, but seeing this is clearly a dupe, I'll just vote as dupe

like image 38
sehe Avatar answered Oct 25 '22 17:10

sehe