所以我试着做一个随机数发生器,它会给我1,2或3,但出于某种原因,它总是给我3。抱歉,法语,但我觉得这并不重要。还有告诉我,如果有什么东西丢失了,我第一次在这里发帖。
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
RPC choixOrdi()
{
int min = 1;
int max = 3;
int randNum = rand() % (max - min + 1) + min;
return convertirRandNum(randNum);
}
RPC convertirRandNum(int randNum)
{
switch (randNum)
{
case 1:
return RPC::Roche;
break;
case 2:
return RPC::Papier;
break;
case 3:
return RPC::Ciseaux;
break;
default:
return RPC::Invalid;
}
}```发布于 2022-02-18 03:42:57
问题是,随机的种子没有被正确地播种。由于当前计算机无法生成真正的随机数,它生成确定性的伪随机数序列,必须由您选择的数字初始化。这叫做播种。一种解决方案是使用rand()按当前时间使用srand(time(NULL))进行种子设置。例如:
RPC choixOrdi()
{
int min = 1;
int max = 3;
srand(time(NULL));
int randNum = rand() % (max - min + 1) + min;
return convertirRandNum(randNum);
}还可以有更多的改进。您可以丢弃C风格的随机生成器,并使用std::random_device、std::mt19937等。您可以在这里找到示例:https://en.cppreference.com/w/cpp/numeric/random
编辑:正如其他人指出的那样,每次调用函数时都要播种rand( time (NULL)),这确实是一个错误的选择,特别是当您有多个客户机同时调用该函数时。如果您可以使用random_device,这可能是其他解决办法:
RPC choixOrdi()
{
int min = 1;
int max = 3;
static std::random_device rd;
static std::uniform_int_distribution<int> dist(min, max);
return convertirRandNum(dist(rd));
}https://stackoverflow.com/questions/71168115
复制相似问题