private Layer[] CreateNeurons(IOutput[] outputs, int numberOfNeurons)
        {
            //These will all form a layer
            List <Synapse> allSynapses = new List <Synapse>(numberOfNeurons * outputs.Length);

            //These will form another layer
            Neuron[] neurons = new Neuron[numberOfNeurons];

            for (int neuronIndex = 0; neuronIndex < numberOfNeurons; neuronIndex++)
            {
                Synapse[] synapses = outputs
                                     .Select(o => new Synapse(o, _randomNumberGenerator.Next()))
                                     .ToArray();

                allSynapses.AddRange(synapses);

                neurons[neuronIndex] = new Neuron(synapses.Cast <IOutput>().ToArray(), _randomNumberGenerator.Next());
            }

            return(new Layer[]
            {
                new Layer(allSynapses.Cast <IPropagate>().ToArray(), allSynapses.Cast <IOutput>().ToArray()),
                new Layer(neurons.Cast <IPropagate>().ToArray(), neurons.Cast <IOutput>().ToArray()),
            });
        }