【问题标题】:C++ generate random number every timeC++每次生成随机数
【发布时间】:2017-09-11 22:07:59
【问题描述】:

我需要为大学作业制作一个模拟器。在这个模拟器中有 3 台计算机,其中 2 台向计算机 1 发送消息,然后计算机 1 决定是发送消息还是拒绝它。拒绝是随机的,计算机 2 的拒绝率为 20%,计算机 3 的拒绝率为 50%。我将 rand()%100+1 函数与 srand(time(NULL)) 种子一起使用。它产生一个随机数,但是我需要多次运行它,并且每次使用相同的随机数。例如,如果我运行模拟 12 次并且生成的数字是 45,则 45 被使用了 12 次。我都将随机数生成器放在代码内部并在外部创建了一个函数。 怎么做一个随机数生成器,每次都生成一个随机数?

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

using namespace std;

int randomgen()
{
int rndnum=0;
srand (time(NULL));
rndnum=rand()%100+1;
cout<< rndnum<<endl;
return rndnum;
}


struct comp1
{

int rejected=0; 
int received=0; 
int sent=0; 
int onhold=0; 


bool comp2reception()
{
    received++;
    bool result=false;
    int rndnum=0;
    srand (time(NULL));
    rndnum=rand()%100+1;

    if(rndnum<=20)
    {
        rejected++;
        result=false;
    }
    if(rndnum>=21)
    {
        onhold++;
        result=true;
    }
    return result;
}



bool comp3reception()
{
    received++;
    bool result=false;
    int rndnum=randomgen;

    if(rndnum<=50)
    {
        rejected++;
        result=false;
    }
    if(rndnum>=51)
    {
        onhold++;
        result=true;
    }
    return result;
}

};

【问题讨论】:

  • 您不应该多次使用srand。实际上,您根本不应该使用它。看this example
  • 你需要在main函数中放一次srand,其他地方不要放
  • 如果您每次请求随机数时都使用相同的种子值调用srand,您将得到相同的数字。将对srand 的调用移至main 函数的顶部,在该函数中只会在程序启动时调用一次。
  • 您应该使用一次srand(),然后在其他任何地方使用rand()
  • 就是这样,主要使用 srand() 一次。谢谢。

标签: c++ random numbers generator


【解决方案1】:

使用 C++11 标头 &lt;random&gt;

#include <random>

static std::random_device rd;
static std::mt19937 gen(rd());

int randomgen()
{
  std::uniform_int_distribution<> dis(0,100);
  int rndnum = dis(gen);
  std::cout << rndnum << std::endl;
  return rndnum;
}

【讨论】:

    【解决方案2】:

    在程序开始时只调用一次srand(time(NULL))

    由于time() 从 1970 年返回秒数,并且您的程序可能需要更少的时间来完成,因此您基本上在每次调用之前将生成器重置为相同的值。哪个当然会在每次调用时返回相同的(第一个)值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多