C++ 程序在代码块 IDE 中不起作用

c++ program not working in code block IDE

本文关键字:IDE 不起作用 代码 程序 C++      更新时间:2023-10-16

我有一个简单的C++程序来生成均匀的分布式随机数,该程序在Visual Studio中工作正常。 但是当我在代码块 IDE 中运行它时,我得到重复的随机数,我该如何解决这个请求?

#include <random>
#include <functional>
#include <ctime>
#include<iostream>
using namespace std;
double Rand()
{
random_device seeder;
const auto seed = seeder.entropy() ? seeder() : time(nullptr);
mt19937 eng(static_cast<mt19937::result_type>(seed));
uniform_real_distribution<double> dist(0, 1);
auto gen = bind(dist, eng);
return gen();
}
int main()
{
srand((unsigned)time(0));
for (unsigned int i = 0; i < 10; ++i)
cout<<Rand()<<endl;
return 0;
}

您可以像这样重写Rand()函数:

double Rand()
{
static random_device seeder;
static mt19937 eng(seeder());
uniform_real_distribution<double> dist(0, 1);
return dist(eng);
}

这是一个演示。

代码有几个问题。

首先,它根据.entropy()的值决定是否应使用std::random_device

我不确定它是否正确检测到GCC-9.2 MinGW之前的损坏random_device(每次运行程序时都会返回相同的数字序列(,而且我手上没有旧的MinGW来检查。但无论如何,根据 cpp 偏好,它会错误地决定避免在 libc++ 上random_device.entropy()总是返回0.

我的建议是无条件地使用std::random_device。如果你有一个旧的 MinGW 坏了,更新编译器。

第二个问题是每次调用函数时它都会重新创建mt19937 eng,这没有多大意义。可能应该是static.如果代码使用基于时间的种子设定(.entropy()恰好返回 0(,那么它可能会给你相同的数字,因为该函数被调用多次而没有延迟;否则它只是效率低下。

这是固定代码:

#include <iostream>
#include <random>
double Rand()
{
static std::mt19937 eng(std::random_device{}());
std::uniform_real_distribution<double> dist(0, 1);
return dist(eng);
}
int main()
{
for (int i = 0; i < 10; ++i)
std::cout << Rand() << std::endl;
}

我还删除了完全不必要的std::bind调用和std::srand调用,由于您不使用std::rand,因此没有执行任何操作。

如果这个程序每次运行它时都给你相同的数字,这可能意味着你有一个旧的MinGW,random_device坏了。然后更新编译器。(MSYS2 是在 Windows 上获得前沿 GCC 的好方法。