Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveOverfittingAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveOverfittingAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SingleObjective/SymbolicClassificationSingleObjectiveOverfittingAnalyzer.cs	(revision 5882)
@@ -28,4 +28,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification {
@@ -76,11 +77,9 @@
       double[] trainingQuality = QualityParameter.ActualValue.Select(x => x.Value).ToArray();
       // evaluate on validation partition
-      int start = ValidationPartitionParameter.ActualValue.Start;
-      int end = ValidationPartitionParameter.ActualValue.End;
-      var rows = Enumerable.Range(start, end - start);
-      if (!rows.Any()) return base.Apply();
+      IEnumerable<int> rows = GenerateRowsToEvaluate();
+      if (rows.Count() <= 0) return base.Apply();
 
       IExecutionContext childContext = (IExecutionContext)ExecutionContext.CreateChildOperation(EvaluatorParameter.ActualValue);
-      double[] validationQuality = (from tree in SymbolicExpressionTrees
+      double[] validationQuality = (from tree in SymbolicExpressionTree
                                     select EvaluatorParameter.ActualValue.Evaluate(childContext, tree, ProblemDataParameter.ActualValue, rows))
                                    .ToArray();
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveOverfittingAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveOverfittingAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression/3.4/SingleObjective/SymbolicRegressionSingleObjectiveOverfittingAnalyzer.cs	(revision 5882)
@@ -28,4 +28,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression {
@@ -74,13 +75,11 @@
 
     public override IOperation Apply() {
+      IEnumerable<int> rows = GenerateRowsToEvaluate();
+      if (rows.Count() <= 0) return base.Apply();
+
       double[] trainingQuality = QualityParameter.ActualValue.Select(x => x.Value).ToArray();
       // evaluate on validation partition
-      int start = ValidationPartitionParameter.ActualValue.Start;
-      int end = ValidationPartitionParameter.ActualValue.End;
-      var rows = Enumerable.Range(start, end - start);
-      if (!rows.Any()) return base.Apply();
-
       IExecutionContext childContext = (IExecutionContext)ExecutionContext.CreateChildOperation(EvaluatorParameter.ActualValue);
-      double[] validationQuality = (from tree in SymbolicExpressionTrees
+      double[] validationQuality = (from tree in SymbolicExpressionTree
                                     select EvaluatorParameter.ActualValue.Evaluate(childContext, tree, ProblemDataParameter.ActualValue, rows))
                                    .ToArray();
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisAnalyzer.cs	(revision 5882)
@@ -49,5 +49,5 @@
     #endregion
     #region properties
-    public ItemArray<ISymbolicExpressionTree> SymbolicExpressionTrees {
+    public ItemArray<ISymbolicExpressionTree> SymbolicExpressionTree {
       get { return SymbolicExpressionTreeParameter.ActualValue; }
     }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveTrainingBestSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveTrainingBestSolutionAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveTrainingBestSolutionAnalyzer.cs	(revision 5882)
@@ -87,5 +87,5 @@
       #region find best trees
       IList<int> nonDominatedIndexes = new List<int>();
-      ISymbolicExpressionTree[] tree = SymbolicExpressionTrees.ToArray();
+      ISymbolicExpressionTree[] tree = SymbolicExpressionTree.ToArray();
       List<double[]> qualities = Qualities.Select(x => x.ToArray()).ToList();
       bool[] maximization = Maximization.ToArray();
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveValidationAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveValidationAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveValidationAnalyzer.cs	(revision 5882)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -25,4 +26,7 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using System;
+using HeuristicLab.Random;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -35,4 +39,5 @@
     where T : class, ISymbolicDataAnalysisMultiObjectiveEvaluator<U>
     where U : class, IDataAnalysisProblemData {
+    private const string RandomParameterName = "Random";
     private const string ProblemDataParameterName = "ProblemData";
     private const string EvaluatorParameterName = "Evaluator";
@@ -42,4 +47,7 @@
 
     #region parameter properties
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; }
+    }
     public ILookupParameter<U> ProblemDataParameter {
       get { return (ILookupParameter<U>)Parameters[ProblemDataParameterName]; }
@@ -72,4 +80,18 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index."));
     }
+
+    protected IEnumerable<int> GenerateRowsToEvaluate() {
+      int seed = RandomParameter.ActualValue.Next();
+      int samplesStart = ValidationPartitionParameter.ActualValue.Start;
+      int samplesEnd = ValidationPartitionParameter.ActualValue.End;
+      int testPartitionStart = ProblemDataParameter.ActualValue.TestPartition.Start;
+      int testPartitionEnd = ProblemDataParameter.ActualValue.TestPartition.End;
+
+      if (samplesEnd < samplesStart) throw new ArgumentException("Start value is larger than end value.");
+      int count = (int)((samplesEnd - samplesStart) * RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value);
+      if (count == 0) count = 1;
+      return RandomEnumerable.SampleRandomNumbers(seed, samplesStart, samplesEnd, count)
+        .Where(i => i < testPartitionStart || testPartitionEnd <= i);
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveValidationBestSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveValidationBestSolutionAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisMultiObjectiveValidationBestSolutionAnalyzer.cs	(revision 5882)
@@ -75,8 +75,6 @@
 
     public override IOperation Apply() {
-      int start = ValidationPartitionParameter.ActualValue.Start;
-      int end = ValidationPartitionParameter.ActualValue.End;
-      int count = (int)((end - start) * RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value);
-      if (count <= 0) return base.Apply();
+      IEnumerable<int> rows = GenerateRowsToEvaluate();
+      if (rows.Count() <= 0) return base.Apply();
 
       var results = ResultCollection;
@@ -95,10 +93,9 @@
       #region find best trees
       IList<int> nonDominatedIndexes = new List<int>();
-      ISymbolicExpressionTree[] tree = SymbolicExpressionTrees.ToArray();
+      ISymbolicExpressionTree[] tree = SymbolicExpressionTree.ToArray();
       List<double[]> qualities = new List<double[]>();
       bool[] maximization = Maximization.ToArray();
       List<double[]> newNonDominatedQualities = new List<double[]>();
       var evaluator = EvaluatorParameter.ActualValue;
-      IEnumerable<int> rows = RandomEnumerable.SampleRandomNumbers(start, end, count);
       IExecutionContext childContext = (IExecutionContext)ExecutionContext.CreateChildOperation(evaluator);
       for (int i = 0; i < tree.Length; i++) {
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveTrainingBestSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveTrainingBestSolutionAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveTrainingBestSolutionAnalyzer.cs	(revision 5882)
@@ -74,5 +74,5 @@
       double bestQuality = Maximization.Value ? double.NegativeInfinity : double.PositiveInfinity;
       ISymbolicExpressionTree bestTree = null;
-      ISymbolicExpressionTree[] tree = SymbolicExpressionTrees.ToArray();
+      ISymbolicExpressionTree[] tree = SymbolicExpressionTree.ToArray();
       double[] quality = Quality.Select(x => x.Value).ToArray();
       for (int i = 0; i < tree.Length; i++) {
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveValidationAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveValidationAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveValidationAnalyzer.cs	(revision 5882)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -25,4 +26,7 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using System;
+using HeuristicLab.Random;
 
 namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
@@ -35,4 +39,5 @@
     where T : class, ISymbolicDataAnalysisSingleObjectiveEvaluator<U>
     where U : class, IDataAnalysisProblemData {
+    private const string RandomParameterName = "Random";
     private const string ProblemDataParameterName = "ProblemData";
     private const string EvaluatorParameterName = "Evaluator";
@@ -42,4 +47,7 @@
 
     #region parameter properties
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; }
+    }
     public ILookupParameter<U> ProblemDataParameter {
       get { return (ILookupParameter<U>)Parameters[ProblemDataParameterName]; }
@@ -66,4 +74,5 @@
     public SymbolicDataAnalysisSingleObjectiveValidationAnalyzer()
       : base() {
+      Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random generator."));
       Parameters.Add(new LookupParameter<U>(ProblemDataParameterName, "The problem data of the symbolic data analysis problem."));
       Parameters.Add(new LookupParameter<T>(EvaluatorParameterName, "The operator to use for fitness evaluation on the validation partition."));
@@ -72,4 +81,18 @@
       Parameters.Add(new ValueLookupParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index."));
     }
+
+    protected IEnumerable<int> GenerateRowsToEvaluate() {
+      int seed = RandomParameter.ActualValue.Next();
+      int samplesStart = ValidationPartitionParameter.ActualValue.Start;
+      int samplesEnd = ValidationPartitionParameter.ActualValue.End;
+      int testPartitionStart = ProblemDataParameter.ActualValue.TestPartition.Start;
+      int testPartitionEnd = ProblemDataParameter.ActualValue.TestPartition.End;
+
+      if (samplesEnd < samplesStart) throw new ArgumentException("Start value is larger than end value.");
+      int count = (int)((samplesEnd - samplesStart) * RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value);
+      if (count == 0) count = 1;
+      return RandomEnumerable.SampleRandomNumbers(seed, samplesStart, samplesEnd, count)
+        .Where(i => i < testPartitionStart || testPartitionEnd <= i);
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveValidationBestSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveValidationBestSolutionAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisSingleObjectiveValidationBestSolutionAnalyzer.cs	(revision 5882)
@@ -76,13 +76,10 @@
       double bestQuality = Maximization.Value ? double.NegativeInfinity : double.PositiveInfinity;
       ISymbolicExpressionTree bestTree = null;
-      ISymbolicExpressionTree[] tree = SymbolicExpressionTrees.ToArray();
+      ISymbolicExpressionTree[] tree = SymbolicExpressionTree.ToArray();
       double[] quality = new double[tree.Length];
       var evaluator = EvaluatorParameter.ActualValue;
-      int start = ValidationPartitionParameter.ActualValue.Start;
-      int end = ValidationPartitionParameter.ActualValue.End;
-      int count = (int)((end - start) * RelativeNumberOfEvaluatedSamplesParameter.ActualValue.Value);
-      if (count <= 0) return base.Apply();
+      IEnumerable<int> rows = GenerateRowsToEvaluate();
+      if (rows.Count() <= 0) return base.Apply();
 
-      IEnumerable<int> rows = RandomEnumerable.SampleRandomNumbers(start, end, count);
       IExecutionContext childContext = (IExecutionContext)ExecutionContext.CreateChildOperation(evaluator);
       for (int i = 0; i < tree.Length; i++) {
Index: /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisValidationAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisValidationAnalyzer.cs	(revision 5881)
+++ /trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisValidationAnalyzer.cs	(revision 5882)
@@ -25,4 +25,5 @@
     where T : class,ISymbolicDataAnalysisEvaluator<U>
     where U : class, IDataAnalysisProblemData {
+    ILookupParameter<IRandom> RandomParameter { get; }
     ILookupParameter<U> ProblemDataParameter { get; }
     ILookupParameter<T> EvaluatorParameter { get; }
