尝试从类生成随机int

时间:2019-04-04 07:30:02

标签: c++ random

我正在尝试在C ++中实现神经网络。 我创建了一个“神经”类,每个神经都有一个权重向量,如下所示:

std::vector <float> weight;

我想在主要功能上创建神经网络。每个神经必须随机填充其权重向量。

这是我尝试过的方法:

每个神经元都有一种填充权重向量的方法

void neural::fillWeight(int numWeight)
{
    srand(time(NULL));

    for (size_t i = 0; i < numWeight; i++)
    {
        std::cout << "on viens de mettre un poid dans le vecteur" << std::endl;
        this->poid.push_back(rand());
    }
}

我在这里称呼它

std::vector <neural> vectN ; 

for (size_t i = 0; i < 5; i++)
{
    neural test = neural(i, 1, 4);
    vectN.push_back(test);
}

问题在于向量中的每个神经都具有相同的权重向量。 我该如何解决这个问题? 预先感谢您的帮助

3 个答案:

答案 0 :(得分:4)

例如,在 main

执行srand(time(NULL)); 一次,否则,因为您的程序执行速度可能非常快,因此您停留在同一秒钟,然后重新初始化重做neural::fillWeight

中相同内容的rand序列

答案 1 :(得分:2)

这里有几个问题。

  1. srand(time(NULL));中调用fillWeight将在向量之间引入明显的相关性(在您的情况下是完美的!)。

  2. 根据您的类判断,您可能需要使用线程安全技术。甚至现代的C ++ 11随机数库也不是线程安全的。

  3. rand尽管在许多情况下很有用,但在统计上却有缺陷。

  4. rand返回整数类型,根据名称判断您是否不需要[0,1)中的数字?

如果您能够与(3)一起生活-并且如果您正在建立“未经训练的”网络,那么您很可能会这样做-那么解决这些问题的一种方法是通过种子fillWeight,并为这些术语使用又快又脏生成器:

void neural::fillWeight(int numWeight, std::uint32_t I){
for (size_t i = 0; i < numWeight; i++){
    std::cout << "Some fancy French" << std::endl;
    this->poid.push_back(1.0f * I / std::numeric_limits<std::uint32_t>::max());
    I = 1664525 * I + 1013904223; // Donald Knuth's numbers.
}

如果您需要负数或其他范围,请将转换调整为float。然后,您可以使用“外部” Mersenne-Twister生成器来生成I,然后传递给函数。

如果没有足够的统计属性,则您可能需要使用“全局”梅森·Twister生成器。

答案 2 :(得分:0)

使用#include <random>中定义的随机数,并针对初始化进行

std::default_random_engine engine((std::random_device())());
   std::uniform_int_distribution<int8_t> rand_dist(0, std::numeric_limits<int8_t>::max());

通过调用

获得随机整数

(随机整数)rand_int = rand_dist(engine);

您可能还需要添加<limits>

相关问题