c ++ - 在循环构造函数调用中创建的对象的重复项

时间:2016-01-09 02:43:35

标签: c++ oop

我已经定义了一个类,然后使用数组中的构造函数创建它的实例。出于某种原因,这只是创建实例,其中许多实际上最终具有完全相同的属性,尽管它们都是随机的。这是构造函数。

class fNNGA: public fNN
{
public:
    fNNGA()
    {

    }

    fNNGA(int n)
    {
        int i;

        _node.resize(n);

        for(i = 0; i < n; i++)
        {
            _node[i]._activation = -1;
        }
    }

    fNNGA(int n, int inp, int out, int edge)
    {
        int i,u,v;

        _node.resize(n);

        for(i = 0; i < n; i++)
        {
            _node[i]._activation = 1;
        }

        for(i = 0; i < inp; i++)
        {
            setInput(i);
        }

        for(i = n - out; i < n; i++)
        {
            setOutput(i);
        }

        for(i = 0; i < edge; i++)
        {
            v = rand() % (n - inp) + inp;
            u = rand() % v;

            setEdge(u,v);
        }

        init();
    }
};

这些是我尝试创建阵列的一些方法:

fNNGA pop[SIZE];

int main()
{
    for(int i = 0; i < SIZE; i++)
    {
        pop[i] = fNNGA(100,16,8,800);
    }
}

fNNGA *pop[SIZE];

int main()
{
    for(int i = 0; i < SIZE; i++)
    {
        pop[i] = new fNNGA(100,16,8,800);
    }
}

fNNGA *pop = new fNNGA[SIZE];

int main()
{
    for(int i = 0; i < SIZE; i++)
    {
        new(pop[i]) fNNGA(100,16,8,800);
    }
}

我怎样才能正确创建这些对象?

2 个答案:

答案 0 :(得分:3)

不要在构造函数中调用srand。请记住,在大多数平台上,time函数返回中的时间,因此如果您的构造函数在一秒内被调用多次(很可能发生),那么所有这些调用都将调用{{ 1}}并设置完全相同的种子。

仅在程序开头调用srand 一次。或者使用C ++ 11中引入的新pseudo-random number generating classes

答案 1 :(得分:1)

首先,如果您的程序在一秒钟内运行,则无法使用srandtime(null)的所有结果都相同。此外,每次使用相同的种子播种rand()时,它必须生成相同的值序列。

我的测试代码和输出如下:

#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;

#define null 0

int main(int argc, char const *argv[])
{
  srand(time(null));
  cout << "time:" << time(null) << endl;
  cout << "rand 0:" << rand() << " " << rand() << " " << rand() << endl << endl;

  //to make the program run for more than a second
  for (int i = 0; i < 100000000; ++i)
  {
    int t = 0;
    t = t / 3;
    t = t / 3;
    t = t / 3;
    t = t / 3;
    t = t / 3;
    t = t / 3;
    t = t / 3;
  }

  srand(time(null));
  cout << "time:" << time(null) << endl;
  cout << "rand 1:" << rand() << " " << rand() << " " << rand() << endl << endl;

  srand(time(null));
  cout << "time:" << time(null) << endl;
  cout << "rand 2:" << rand() << " " << rand() << " " << rand() << endl;

  return 0;
}

输出:

  

时间:1452309501

     

rand 0:5552 28070 20827

     

时间:1452309502

     

rand 1:23416 6051 20830

     

时间:1452309502

     

rand 2:23416 6051 20830

更多详细信息,请参阅srandtime