gpt4 book ai didi

c++ - 我可以使用单个 `default_random_engine` 来创建多个正态分布的数字集吗?

转载 作者:行者123 更新时间:2023-11-28 01:38:09 26 4
gpt4 key购买 nike

我想生成一组单位 vector (对于任意维度),它们均匀分布在所有方向上。为此,我为每个 vector 分量生成正态分布的数字,并按幅度的倒数缩放结果。

我的问题:我可以使用单个 std::default_random_engine 为我的 vector 的所有组件生成数字,还是每个组件都需要自己的引擎?

Afaik,每个组件都需要独立地呈高斯分布才能进行数学计算,我无法评估这两种情况之间的差异。这是一个具有单个 RNG 的 MWE(此处省略了 vector 的分配和归一化)。

std::vector<std::vector<double>> GenerateUnitVecs(size_t dimension, size_t count)
{
std::vector<std::vector<double>> result;

/* Set up a _single_ RNG */
size_t seed = GetSeed(); // system_clock
std::default_random_engine gen(seed);
std::normal_distribution<double> distribution(0.0, 1.0);

/* Generate _multiple_ (independent?) distributions */
for(size_t ii = 0; ii < count; ++ii){
std::vector<double> vec;
for(size_t comp = 0; comp < dimension; ++comp)
vec.push_back(distribution(gen)); // <-- random number goes here

result.push_back(vec);
}
return result;
}

谢谢。

最佳答案

OP 询问:

My question: Can I use a single std::default_random_engine to generate numbers for all components of my vector or does every component require its own engine?


我建议正如其他人在关于不使用 std::default_random_engine 的评论中所述,而是使用 std::random_devicestd::chrono: :high_resolution_clock


要将random_device 用于正态分布Gaussian 非常简单:

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>

int main() {

std::random_device rd{};
std::mt19937 gen{ rd() };

// values near the mean are the most likely
// standard deviation affects the dispersion of generated values from the mean
std::normal_distribution<> d{5,2};

std::map<int, int> hist{};
for ( int n=0; n<10000; ++n ) {
++hist[std::round(d(gen))];
}
for ( auto p : hist ) {
std::cout << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*' ) << '\n';
}
}

要使用 std::chrono::high_resolution_clock:需要做更多的工作,但同样简单。

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
#include <limits>
#include <chrono>

class ChronoClock {
public:
using Clock = std::conditional_t<std::chrono::high_resolution_clock::is_steady,
std::chrono::high_resolution_clock,
std::chrono::steady_clock>;

static unsigned int getTimeNow() {
unsigned int now = static_cast<unsigned int>(Clock::now().time_since_epoch().count());
return now;
}
};

int main() {

/*static*/ std::mt19937 gen{}; // Can be either static or not.

gen.seed( ChronoClock::getTimeNow() );

// values near the mean are the most likely
// standard deviation affects the dispersion of generated values from the mean
std::normal_distribution<> d{5,2};

std::map<int, int> hist{};
for ( int n=0; n<10000; ++n ) {
++hist[std::round(d(gen))];
}
for ( auto p : hist ) {
std::cout << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*' ) << '\n';
}
}

正如您从上面的示例中看到的那样 here来自 cppreference.com 的是单一引擎、单一种子和单一分布,它使用单一引擎生成随机数或随机数集。


编辑 - 此外,您可以使用我编写的类作为随机引擎随机分布的包装类。可以引用我的这个回答here .

关于c++ - 我可以使用单个 `default_random_engine` 来创建多个正态分布的数字集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48370594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com