试图从类中生成随机int

问题描述 投票:3回答:3

我正在尝试用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);
}

问题是载体中的每个神经元都具有相同的权重向量。我该如何解决这个问题?提前感谢您的帮助

c++ random
3个回答
4
投票

例如,srand(time(NULL));有一次在main,或者因为你的程序在执行时可能非常快,你在同一秒内停留并重新启动rand序列以重做同样的事情在neural::fillWeight


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生成器生成传递给函数的Is。

如果这没有足够的统计属性,那么您可能需要使用“全局”Mersenne Twister生成器。


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());

通过调用得到一个随机的int

(随机int)rand_int = rand_dist(engine);

你可能还需要添加<limits>

© www.soinside.com 2019 - 2024. All rights reserved.