Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java	(revision 385)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/IStochasticProcess.java	(revision 386)
@@ -59,4 +59,28 @@
 	 */
 	public List<? extends Event<?>> randomSequence();
+
+	/**
+	 * <p>
+	 * Generates a random sequence of events. The sequence starts with
+	 * {@link Event#STARTEVENT} and finishes with
+	 * <ul>
+	 * <li>{@link Event#ENDEVENT} if validEnd==true.</li>
+	 * <li>b) if a generated sequences reaches {@link Event#ENDEVENT} before
+	 * maxLength, the sequence finishes and is shorter than maxLenght.
+	 * Otherwise, the sequence finishes as soon as maxLength is reached and the
+	 * final event of the sequence must not be {@link Event#ENDEVENT}.</li>
+	 * </ul>
+	 * </p>
+	 * 
+	 * @param maxLength
+	 *            maximum length of the generated sequence
+	 * @param validEnd
+	 *            if true, only sequences that finish with
+	 *            {@link Event#ENDEVENT} are generated
+	 * @return randomly generated sequence
+	 * 
+	 */
+	public List<? extends Event<?>> randomSequence(int maxLength,
+			boolean validEnd);
 
 	/**
Index: /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java
===================================================================
--- /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java	(revision 385)
+++ /trunk/EventBenchCore/src/de/ugoe/cs/eventbench/models/TrieBasedModel.java	(revision 386)
@@ -143,31 +143,44 @@
 	@Override
 	public List<? extends Event<?>> randomSequence() {
+		return randomSequence(Integer.MAX_VALUE, true);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.eventbench.models.IStochasticProcess#randomSequence()
+	 */
+	@Override
+	public List<? extends Event<?>> randomSequence(int maxLength,
+			boolean validEnd) {
 		List<Event<?>> sequence = new LinkedList<Event<?>>();
 		if (trie != null) {
-			IncompleteMemory<Event<?>> context = new IncompleteMemory<Event<?>>(
-					trieOrder - 1);
-			context.add(Event.STARTEVENT);
-
-			Event<?> currentState = Event.STARTEVENT;
-
 			boolean endFound = false;
-
-			while (!endFound) {
-				double randVal = r.nextDouble();
-				double probSum = 0.0;
-				List<Event<?>> currentContext = context.getLast(trieOrder);
-				for (Event<?> symbol : trie.getKnownSymbols()) {
-					probSum += getProbability(currentContext, symbol);
-					if (probSum >= randVal) {
-						endFound = (symbol == Event.ENDEVENT);
-						if (!(symbol == Event.STARTEVENT || symbol == Event.ENDEVENT)) {
-							// only add the symbol the sequence if it is not
-							// START
-							// or END
-							context.add(symbol);
-							currentState = symbol;
-							sequence.add(currentState);
+			while (!endFound) { // outer loop for length checking
+				sequence = new LinkedList<Event<?>>();
+				IncompleteMemory<Event<?>> context = new IncompleteMemory<Event<?>>(
+						trieOrder - 1);
+				context.add(Event.STARTEVENT);
+
+				Event<?> currentState = Event.STARTEVENT;
+
+				while (!endFound && sequence.size() < maxLength) {
+					double randVal = r.nextDouble();
+					double probSum = 0.0;
+					List<Event<?>> currentContext = context.getLast(trieOrder);
+					for (Event<?> symbol : trie.getKnownSymbols()) {
+						probSum += getProbability(currentContext, symbol);
+						if (probSum >= randVal) {
+							if (!(symbol == Event.STARTEVENT || symbol == Event.ENDEVENT)) {
+								// only add the symbol the sequence if it is not
+								// START or END
+								context.add(symbol);
+								currentState = symbol;
+								sequence.add(currentState);
+							}
+							endFound = (symbol == Event.ENDEVENT)
+									|| (!validEnd && sequence.size() == maxLength);
+							break;
 						}
-						break;
 					}
 				}
@@ -252,5 +265,9 @@
 		int i = 0;
 		for (Event<?> symbol : trie.getKnownSymbols()) {
-			stateStrings[i] = symbol.toString();
+			if (symbol.toString() == null) {
+				stateStrings[i] = "null";
+			} else {
+				stateStrings[i] = symbol.toString();
+			}
 			i++;
 		}
