Index: cpp/frams/genetics/oper_fx.cpp
===================================================================
--- cpp/frams/genetics/oper_fx.cpp	(revision 757)
+++ cpp/frams/genetics/oper_fx.cpp	(revision 758)
@@ -212,4 +212,31 @@
 	for (int i = 0; i < Neuro::getClassCount(); i++)
 		if (Neuro::getClass(i)->genactive)
+			active.push_back(Neuro::getClass(i));
+	if (active.size() == 0) return NULL; else return active[randomN(active.size())];
+}
+
+NeuroClass* GenoOperators::getRandomNeuroClassWithOutput()
+{
+	vector<NeuroClass*> active;
+	for (int i = 0; i < Neuro::getClassCount(); i++)
+		if (Neuro::getClass(i)->genactive && Neuro::getClass(i)->getPreferredOutput() != 0)
+			active.push_back(Neuro::getClass(i));
+	if (active.size() == 0) return NULL; else return active[randomN(active.size())];
+}
+
+NeuroClass* GenoOperators::getRandomNeuroClassWithInput()
+{
+	vector<NeuroClass*> active;
+	for (int i = 0; i < Neuro::getClassCount(); i++)
+		if (Neuro::getClass(i)->genactive && Neuro::getClass(i)->getPreferredInputs() != 0)
+			active.push_back(Neuro::getClass(i));
+	if (active.size() == 0) return NULL; else return active[randomN(active.size())];
+}
+
+NeuroClass* GenoOperators::getRandomNeuroClassWithOutputAndNoInputs()
+{
+	vector<NeuroClass*> active;
+	for (int i = 0; i < Neuro::getClassCount(); i++)
+		if (Neuro::getClass(i)->genactive && Neuro::getClass(i)->getPreferredOutput() != 0 && Neuro::getClass(i)->getPreferredInputs() == 0)
 			active.push_back(Neuro::getClass(i));
 	if (active.size() == 0) return NULL; else return active[randomN(active.size())];
@@ -342,5 +369,5 @@
 }
 
-bool GenoOperators::isNeuroClassName(const char firstchar)
+bool GenoOperators::canStartNeuroClassName(const char firstchar)
 {
 	return isupper(firstchar) || firstchar == '|' || firstchar == '@' || firstchar == '*';
Index: cpp/frams/genetics/oper_fx.h
===================================================================
--- cpp/frams/genetics/oper_fx.h	(revision 757)
+++ cpp/frams/genetics/oper_fx.h	(revision 758)
@@ -194,6 +194,10 @@
 	static void linearMix(ParamInterface &p1, int i1, ParamInterface &p2, int i2, double proportion); ///<mixes i1'th and i2'th properties of p1 and p2; inherited proportion should be within [0,1]; 1.0 does not change values (all inherited), 0.5 causes both properties to become their average, 0.0 swaps values (none inherited). For integer properties applies random "dithering" when necessary.
 	static NeuroClass* getRandomNeuroClass(); ///<returns random neuroclass or NULL when no active classes.
-	static int getRandomNeuroClassWithOutput(const vector<NeuroClass*>& NClist); //returns index of random neuroclass from the NClist or -1 (no neurons on the list that provide output)
-	static int getRandomNeuroClassWithInput(const vector<NeuroClass*>& NClist); //returns index of random neuroclass from the NClist or -1 (no neurons on the list that want input(s))
+	static NeuroClass* getRandomNeuroClassWithOutput(); ///<returns random neuroclass with output or NULL when no active classes.
+	static NeuroClass* getRandomNeuroClassWithInput(); ///<returns random neuroclass with input or NULL when no active classes.
+	static NeuroClass* getRandomNeuroClassWithOutputAndNoInputs(); ///<returns random sensor or NULL when no active classes.
+	static NeuroClass* getRandomSensorProb(float prob); ///<returns random sensor (only-output neuron class) with presented probability or NULL. \e prob probability of picking neuron class.
+	static int getRandomNeuroClassWithOutput(const vector<NeuroClass*>& NClist); ///<returns index of random NeuroClass from the NClist or -1 (no neurons on the list that provide output) \e NClist list of available neuron classes
+	static int getRandomNeuroClassWithInput(const vector<NeuroClass*>& NClist); ///<returns index of random NeuroClass from the NClist or -1 (no neurons on the list that want input(s)) \e NClist list of available neuron classes
 	static int getRandomChar(const char *choices, const char *excluded); ///<returns index of a random character from 'choices' excluding 'excluded', or -1 when everything is excluded or 'choices' is empty.
 	static NeuroClass* parseNeuroClass(char *&s); ///<returns longest matching neuroclass or NULL if the string does not begin with a valid neuroclass name. Advances \e s pointer.
@@ -204,5 +208,5 @@
 	static bool areAlike(char*, char*); ///<compares two text strings skipping whitespaces. Returns 1 when equal, 0 when different.
 	static char* strchrn0(const char *str, char ch); ///<like strchr, but does not find zero char in \e str.
-	static bool isNeuroClassName(const char firstchar); ///<determines if \e firstchar may start NeuroClass name. If not, it may start NeuroClass' (or Neuro's) property name.
+	static bool canStartNeuroClassName(const char firstchar); ///<determines if \e firstchar may start NeuroClass name. If not, it may start NeuroClass' (or Neuro's) property name.
 	//@}
 };
