@Override
    protected void launcher() throws IOException {
        initializeRandom(randseed);
        final List<Boolean> isStart = new ArrayList<>();
		final List<StringActions> stringActions = new ArrayList<>();
        final List<String> eventnames = eventNames(eventNames, eventNumber);
        final List<String> events = events(eventnames, eventNumber, 0);
        final List<String> actions = actions(actionNames, actionNumber);
        for (int i = 0; i < size; i++) {
			isStart.add(random().nextDouble() < initialPercentage * 0.01);
			final Set<String> thisActions = new LinkedHashSet<>();
			final int actionNum = minActions + random().nextInt(maxActions - minActions + 1);
			for (int j = 0; j < actionNum; j++) {
				String a;
				do {
					a = actions.get(random().nextInt(actionNumber));
				} while (thisActions.contains(a));
				thisActions.add(a);
			}
			stringActions.add(new StringActions(String.join(", ", new ArrayList<>(thisActions))));
		}
		if (!isStart.contains(true)) {
			isStart.set(0, true);
		}

		final NondetMooreAutomaton automaton = new NondetMooreAutomaton(size, stringActions, isStart);
		for (int i = 0; i < size; i++) {
			for (int j = 0; j < eventNumber; j++) {
				final String event = events.get(j);
				final Set<Integer> present = new TreeSet<>();
				final int transitions = minTrans + random().nextInt(maxTrans - minTrans + 1);
				for (int k = 0; k < transitions; k++) {
					int dst;
					do {
						dst = random().nextInt(size);
					} while (present.contains(dst));
					automaton.state(i).addTransition(event, automaton.state(dst));
					present.add(dst);
				}
			}
		}
		
		if (filepath != null) {
            saveToFile(automaton, filepath);
		} else {
			System.out.println(automaton);
		}
	}