集成Knuth随机数生成器到我的代码

时间:2014-04-26 23:06:48

标签: c

我来自硬件背景,基本上我在verilog中编码。我的目标是生成一堆随机浮点数,执行添加等基本操作,并将输入和输出保存到文件中。这是我的方法。

void PrintDoubleAsCBytes(double d, FILE* f)
{

f = fopen("testcases.txt","a");

  unsigned char a[sizeof(d)];
  unsigned i;
  memcpy(a, &d, sizeof(d));
  for (i = 0; i < sizeof(a); i++){
    fprintf(f, "%0*X", (CHAR_BIT + 3) / 4, a[sizeof(d)-1-i]);

  }
   fprintf(f,"\n");
 fclose(f); /*done!*/
}

int main (int argc, char *argv)
{

int limit = 500 ;
double a, b,c,d,e,f;  
double a1, b1,c1,d1,e1,f1;
double result1;              
double result;
int i,j ;           
printf("limit = %d", limit );
srand(time(NULL));
for (i= 0 ; i< limit;i++)
    {

        c= rand();
        d= rand();
        e= rand();
        f= rand();
        a = c*d;
        b = e*f;
        result = a + b;
        printf ("A= %f B = %f\n",a,b);
        printf ("result= %f\n",result);
        PrintDoubleAsCBytes(a, stdout); puts("");
        PrintDoubleAsCBytes(b, stdout); puts("");
        PrintDoubleAsCBytes(result, stdout); puts("");
    }
    for (j= 0 ; j< limit;j++)
    {

        c1= rand();
        d1= rand();
        e1= rand();
        f1= rand();
        a1 = c1/d1;
        b1 = e1/f1;
        result1 = a1 + b1;
        printf ("A= %f B = %f\n",a1,b1);
        printf ("result= %f\n",result1);
        PrintDoubleAsCBytes(a1, stdout); puts("");
        PrintDoubleAsCBytes(b1, stdout); puts("");
        PrintDoubleAsCBytes(result1, stdout); puts("");
    }
}

代码有效,但问题是这不是随机的。所以我从互联网上得到了一个随机数发生器

//n = (n * 6364136223846793005 + 1442695040888963407) & 0xFFFFFFFFFFFFFFFF;
#define MY_RAND_MAX 0xffffffffffffffffLL
/* the seed                            */
 unsigned long long _myRandseed = 1;

 unsigned long long int (myrand)(void)
 {
    _myRandseed = _myRandseed * 6364136223846793005 + 1442695040888963407;
    return ((unsigned long long int) _myRandseed & MY_RAND_MAX);
 }

 void (mysrand) (unsigned long long int seed)
 {
    _myRandseed = seed;
 }

我想生成A op B = Result。将A,B和Result放入文件中,并使用我的硬件验证值。 这个问题是我的第一个代码没有极值,rand()函数只有32位宽。所以我使用这个Knuth算法来达到这些极值,但我不知道如何将Knuth代码集成到我的代码中。我不知道第二个代码是如何工作的。请帮我把它整合到我的代码中。

0 个答案:

没有答案