首页 > 解决方案 > 在 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_boundandlower_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;
    }

我的问题:

  1. 它给出了关于生成器的错误,所以我不确定我是否正确设置它。我也不确定如何使用std::generator. 我正在尝试它,因为我查看了其他类似的帖子,它似乎允许我一次生成多个随机数,所以我不必为每个元素运行 MxN 次。这是真的吗?如何正确使用它?

  2. 在 python 中,我可以通过矢量化和广播来操作 numpy 数组。在 C++ 中最“矢量化”的方法是什么?

  3. 上面的(不正确的)代码只创建了 0 和 1 之间的随机数,但是如何在 python 版本中合并lower_boundand呢?upper_bound我知道我可以更改里面的值distribution(0,1),但问题是每个维度的限制可能不同(因此每列可以有不同的有效范围),那么考虑到范围,生成随机数的最有效方法是什么每个维度?

谢谢

标签: c++randomstd

解决方案


我将按随机顺序解决它们:

  • 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.

推荐阅读