Create root-node hash Current level is zero Establish limits: max & min nodes per level, number of levels root{A0} = add_levels($current_level, $level_limit, $min_nodes, $max_nodes); sub add_levels { return if current level is > the limit, bump it if not calculate a random number between high and low limit new_level = {}; for $n (0..$local_limit) { generate $name from level and $n new_level{$name} = add_levels($current_level, $limit, $min, $max) } return $new_level; }