请教这个含有位操作的长整型随机数生成函数
从别人那里要了个程序,里面大量用了 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];
}
}
[解决办法]
帮顶,接分