首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rand()语句总是给出相同的数字

Rand()语句总是给出相同的数字
EN

Stack Overflow用户
提问于 2022-02-18 03:35:52
回答 1查看 40关注 0票数 0

所以我试着做一个随机数发生器,它会给我1,2或3,但出于某种原因,它总是给我3。抱歉,法语,但我觉得这并不重要。还有告诉我,如果有什么东西丢失了,我第一次在这里发帖。

代码语言:javascript
复制
#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;
    }
}```
EN

回答 1

Stack Overflow用户

发布于 2022-02-18 03:42:57

问题是,随机的种子没有被正确地播种。由于当前计算机无法生成真正的随机数,它生成确定性的伪随机数序列,必须由您选择的数字初始化。这叫做播种。一种解决方案是使用rand()按当前时间使用srand(time(NULL))进行种子设置。例如:

代码语言:javascript
复制
RPC choixOrdi()
{
    int min = 1;
    int max = 3;
    srand(time(NULL));
    int randNum = rand() % (max - min + 1) + min;
    return convertirRandNum(randNum);
    
}

还可以有更多的改进。您可以丢弃C风格的随机生成器,并使用std::random_devicestd::mt19937等。您可以在这里找到示例:https://en.cppreference.com/w/cpp/numeric/random

编辑:正如其他人指出的那样,每次调用函数时都要播种rand( time (NULL)),这确实是一个错误的选择,特别是当您有多个客户机同时调用该函数时。如果您可以使用random_device,这可能是其他解决办法:

代码语言:javascript
复制
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));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71168115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档