首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问这个含有位操作的长整型随机数生成函数

2012-02-07 
请教这个含有位操作的长整型随机数生成函数从别人那里要了个程序,里面大量用了c语言中的位操作。下面几个函

请教这个含有位操作的长整型随机数生成函数
从别人那里要了个程序,里面大量用了   c语言中的位操作。下面几个函数是用来产生随机数的,看了半天似懂非懂,请大家帮忙看啊!在此谢过了。

......
//   iseed   给定
/////////////////////////////////
//   以下几行为全局变量
#define   L     1000
#define   LMAX   (L+10)
long   m0[128],   mask=(long)2147483647L;
long   npp[LMAX];
/////////////////////////////////

函数调用大概如下:

xinit(   m0,   iseed   );


for   (   i   =   0;   i   <   127;   i++   )
        m0[i]   &=   mask;

loop:
{

x127(   m0,   npp,   L   );

for   (   i   =   0;   i   <   L;   i++   )
          j   =   (   npp[i]   *   L   )   > >   16;

}

以上loop片段是循环片段的。

现在遇到的问题是:当L大于2^15=32768的时候,上面得到的j会是负数,j   本来要得到的应该是0到L-1之间的随机数的。

j   =   (   npp[i]   *   L   )   > >   16;   这一句怎样理解:   得到0到L-1之间的数?


如果想把需要得到的随机数j范围扩大,比如说扩大到2^17这个范围。那么需要怎么更改全局变量mask以及xinit和x127这两个函数,还有在调用的时候又应该怎么做了?


//   以下是两个函数
void   xinit(   long   *m,   long   iseed   )
{
        short     i,   ib,   x;
        static   int   flag=1;
        long     mask[32]={0x1,   0x2,   0x4,   0x8,   0x10,   0x20,   0x40,   0x80,
                      0x100,     0x200,   0x400,   0x800,   0x1000,   0x2000,   0x4000,   0x8000L,
                      0x10000L,0x20000L,0x40000L,   0x80000L,   0x100000L,0x200000L,0x400000L,0x800000L,
                      0x1000000L,   0x2000000L,   0x4000000L,   0x8000000L,   0x10000000L,   0x20000000L,
                      0x40000000L,   0x80000000L};

        if(flag)
        {
                      srand((unsigned)iseed);
                      flag=0;
              }

        for(i=0;   i <127;   i++)
        {
                      m[i]=0;
                      for(ib=0;   ib <=31;   ib++)
                {
                                    x   =   (rand()   > >   8)   &   1;
                                    if(   x   )   m[i]   |=   mask[ib];
                                    }
              }


/*   Warming   UP   MZ   101   times   */
        for(ib=0;   ib <101;   ib++)
        {
                      for(i=0;   i <   97;     i++)
                        m[i]^=m[i+30];
                      for(i=97;   i <127;   i++)
                        m[i]^=m[i-97];
              }
}


void   x127(   long   *m,   long   *r,   long     n   )
{
        long     k,   *m0l;

        m0l=m;
        if(n <127)
        {
                      for(k=0,m=m0l;   k <   97;   k++,   m++)
                        *m^=*(m+30);
                      for(k=97;   k <127;   k++,   m++)
                        *m^=*(m-97);
                      for(k=0;   k <n;   k++)
                        r[k]=m0l[k];
              }
        else
        {
                      for(k=0,m=m0l;   k <   97;   k++,   m++)
                        *m^=*(m+30);
                      for(k=97;   k <127;   k++,   m++)
                        *m^=*(m-97);
                      for(k=0;   k <127;   k++)
                        r[k]=m0l[k];

                      for(k=127;   k <n;   k+=16)
                {
                              r[k]=r[k-97]^r[k-127];
                              r[k+1]   =r[k-96]^r[k-126];
                              r[k+2]   =r[k-95]^r[k-125];
                              r[k+3]   =r[k-94]^r[k-124];
                              r[k+4]   =r[k-93]^r[k-123];
                              r[k+5]   =r[k-92]^r[k-122];
                              r[k+6]   =r[k-91]^r[k-121];


                              r[k+7]   =r[k-90]^r[k-120];
                              r[k+8]   =r[k-89]^r[k-119];
                              r[k+9]   =r[k-88]^r[k-118];
                              r[k+10]=r[k-87]^r[k-117];
                              r[k+11]=r[k-86]^r[k-116];
                              r[k+12]=r[k-85]^r[k-115];
                              r[k+13]=r[k-84]^r[k-114];
                              r[k+14]=r[k-83]^r[k-113];
                              r[k+15]=r[k-82]^r[k-112];
                      }

                for(k=n-127,m=m0l;   k <n;   k++,m++)   *m=r[k];
              }
}  


[解决办法]
帮顶,接分

热点排行