c++ - 在 C++11 中生成随机数组
问题描述
我想创建一个在上下边界内填充随机数的MxN
数组(维度空间M
中的粒子)。N
我有一个看起来像这样的工作 python 代码:
# upper_bound/lower_bound are arrays of shape (dim,)
positions = np.random.rand(num_particle,dim)*(upper_bound-lower_bound)+lower_bound
每一行代表一个粒子,每一列代表问题空间中的一个维度。所以upper_bound
andlower_bound
适用于每一列。现在我想把上面的代码翻译成c++,我有这样的东西:
#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <ctime>
typedef std::vector<double> vect1d;
std::vector<vect1d> positions;
for (int i=0; i<num_particle; i++){
std::mt19937_64 generator(static_cast<std::mt19937::result_type>(time(0)));
std::uniform_real_distribution<double> distribution(0,1);
vect1d pos(dimension);
std::generate(pos.begin(),pos.end(),distribution(generator));
positions[i] = pos;
}
我的问题:
它给出了关于生成器的错误,所以我不确定我是否正确设置它。我也不确定如何使用
std::generator
. 我正在尝试它,因为我查看了其他类似的帖子,它似乎允许我一次生成多个随机数,所以我不必为每个元素运行 MxN 次。这是真的吗?如何正确使用它?在 python 中,我可以通过矢量化和广播来操作 numpy 数组。在 C++ 中最“矢量化”的方法是什么?
上面的(不正确的)代码只创建了 0 和 1 之间的随机数,但是如何在 python 版本中合并
lower_bound
and呢?upper_bound
我知道我可以更改里面的值distribution(0,1)
,但问题是每个维度的限制可能不同(因此每列可以有不同的有效范围),那么考虑到范围,生成随机数的最有效方法是什么每个维度?
谢谢
解决方案
我将按随机顺序解决它们:
- 3.您有多种选择 - 每行使用一个生成器,创建方式类似于
distribution(row_lower_limit, row_upper_limit)
. 应该足够便宜,不会引起问题。如果您想重用同一个生成器,只需执行类似row_lower_limit + distribution(generator) * (row_upper_limit - row_lower_limit)
. 分布是在这两种情况下U[row_lower_limit, row_upper_limit]
。 - 2.矢量化来自
numpy
库,而不是 Python 本身。它最多提供了一些不错的用户体验。C++ 没有与之等效的库numpy
(尽管也有很多库可供它使用 - 只是没有那么普遍)。for
做两个嵌套的 s不会错。NxM
仅仅声明一个数组而不是 a可能会更好vector
,就像这里一样。 - 1.不确定如何解决问题,因为我们不知道错误。cplusplus.com 参考有一个如何参考
random_device
.
推荐阅读
- docker - Docker Mysql 无法通过套接字连接到本地 MySQL 服务器
- gnuplot - Gnuplot:加载调色板?
- javascript - 从另一个控制器调用子控制器
- php - PHP 代码无法区分 Chrome 和 Safari
- ruby-on-rails - 为什么这两条路线的参数名称不同?
- avr - 使用 arduino IDE 进行 pwm 时 ATTINY85 省电(睡眠)
- php - 在 MS Access 和 php 两个日期之间选择
- python - 为什么 python-opencv 中的绘图函数没有返回?
- sql - 如何在 asp.MVC 中实现安全问题以重置密码或更改密码?
- r - 比较组均值