code:

Can't Copy and Paste this?

Click here for a copy-and-paste friendly version of this code!

 

Terms of Agreement:   

By using this code, you agree to the following terms...   

1) You may use this code in your own programs (and may compile it into a program and distribute it in compiled format for langauges that allow it) freely and with no charge.   

2) You MAY NOT redistribute this code (for example to a web site) without written permission from the original author. Failure to do so is a violation of copyright laws.   

3) You may link to this code from another website, but ONLY if it is not wrapped in a frame. 

4) You will abide by any additional copyright restrictions which the author may have placed in the code or code's description.  

//     

#include 

#include 

void init_mm( );

int number_range( int from, int to );

int number_mm( void );

static int rgiState[2+55]; // leave this alone

void main()

    {

     init_mm(); //seed the number generator

     int random = number_range( 10, 100 );

     cout << random << endl;

}

int number_mm( void )

    {

    int *piState;

    int iState1;

    int iState2;

    int iRand;

    piState = &rgiState[2];

    iState1   = piState[-2];

    iState2   = piState[-1];

    iRand   = ( piState[iState1] + piState[iState2] )

     & ( ( 1 << 30 ) - 1 );

    piState[iState1] = iRand;

    if ( ++iState1 == 55 )

     iState1 = 0;

    if ( ++iState2 == 55 )

     iState2 = 0;

    piState[-2] = iState1;

    piState[-1] = iState2;

    return iRand >> 6;

}

/*

* Generate a random number.

*/

int number_range( int from, int to )

    {

    int power;

    int number;

    if ( ( to = to - from + 1 ) <= 1 )

     return from;

    for ( power = 2; power < to; power <<= 1 )

     ;

    while ( ( number = number_mm( ) & ( power - 1 ) ) >= to )

     ;

    return from + number;

}

/*

* this is the Mitchell-Moore algorithm from Knuth Volume II. 

*/

void init_mm( )

    {

    int *piState;

    int iState;

    piState = &rgiState[2];

    piState[-2] = 55 - 55;

    piState[-1] = 55 - 24;

    piState[0] = ( (int) time( NULL ) ) & ( ( 1 << 30 ) - 1 );

    piState[1] = 1;

    for ( iState = 2; iState < 55; iState++ )

        {

         piState[iState] = ( piState[iState-1] + piState[iState-2] )

         & ( ( 1 << 30 ) - 1 );

    }

    return;

}