我已经定义了一个类,然后使用数组中的构造函数创建它的实例。出于某种原因,这只是创建实例,其中许多实际上最终具有完全相同的属性,尽管它们都是随机的。这是构造函数。
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);
}
}
我怎样才能正确创建这些对象?
答案 0 :(得分:3)
不要在构造函数中调用srand
。请记住,在大多数平台上,time
函数返回秒中的时间,因此如果您的构造函数在一秒内被调用多次(很可能发生),那么所有这些调用都将调用{{ 1}}并设置完全相同的种子。
仅在程序开头调用srand
一次。或者使用C ++ 11中引入的新pseudo-random number generating classes。
答案 1 :(得分:1)
首先,如果您的程序在一秒钟内运行,则无法使用srand
,time(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