随机数生成器代码修复(srand48 / drand48的替代)

时间:2017-07-25 12:08:51

标签: c visual-studio visual-c++ random

首先让我说我对C和C ++几乎一无所知。事实上,作为一名数学专业的学生,​​我对编程非常陌生。话虽这么说,我需要包装一些旧的代码,所以我试图努力通过它。现在,在尝试运行测试时,我收到了错误

  

严重级代码描述项目文件行抑制状态   错误LNK2019未解析的外部符号srand48参考   功能主要是PokerEval C:\ Users \ M.Faas \ Documents \ Visual Studio   2017 \ Projects \ Pokerproject \ PokerEvalC \ PokerEval \ allfive.obj 1
  错误LNK2019未解析的外部符号drand48参考   函数shuffle_deck PokerEval C:\ Users \ M.Faas \ Documents \ Visual   Studio 2017 \ Projects \ Pokerproject \ PokerEvalC \ PokerEval \ pokerlib.obj 1
  错误LNK1120 2未解决   外部人物PokerEval C:\ Users \ M.Faas \ Documents \ Visual Studio   2017 \ Projects \ Pokerproject \ PokerEvalC \ PokerEval \ x64 \ Debug \ PokerEval.exe 1

drand48也一样。

我正在使用的代码如下:

#include <stdio.h>
#include "arrays.h"
#include "poker.h"

void srand48();
double drand48();

并继续在这些代码片段中使用srand48和drand48:

// Seed the random number generator.
srand48(getpid());

对于drand48:

//
//  This routine takes a deck and randomly mixes up
//  the order of the cards.
//
void
shuffle_deck(int *deck)
{
    int i, n, temp[52];

    for (i = 0; i < 52; i++)
        temp[i] = deck[i];

    for (i = 0; i < 52; i++)
    {
        do {
            n = (int)(51.9999999 * drand48());
        } while (temp[n] == 0);
        deck[i] = temp[n];
        temp[n] = 0;
    }
}

完整代码可在此处找到:http://suffe.cool/poker/code/

但我想不出办法来解决这个问题,即使它看起来很小。也就是说,速度是绝对必要的,因为代码将运行数百万次。我在x64机器上使用visualstudio。

1 个答案:

答案 0 :(得分:2)

这些声明

void srand48();
double drand48();

已弃用,您应该使用完整原型:

void srand48(long);
double drand48(void);

或更好地包含声明它们的标题。

但问题是这些功能甚至不存在于Windows上。所以只需删除这些声明。您可以使用标准的srand()rand()函数(在stdlib.h中声明)来模拟这些函数(可能会有更低的随机数质量),如下所示:

#define srand48(x) srand((int)(x))
#define drand48() ((double)rand()/RAND_MAX)

这是一个小PoC示例:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define srand48(x) srand((int)(x))
#define drand48() ((double)rand()/RAND_MAX)

int main(void)
{
    srand48(time(0));

    for (;;)
    {
        printf("%f\n", drand48());
    }
}