首先让我说我对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。
答案 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());
}
}