anchor.diff:      NewSize = erlang:max(1, (Size - ListLength) div ListLength),
       [create_value(Type, NewSize, ParseState) || _ <- lists:seq(1, ListLength)];
   create_value(nonempty_string, Size, ParseState) ->
  -    ListLength = erlang:max(1, erlang:min(Size,
  -                                          crypto:rand_uniform(list_length_min(),
  -                                                              list_length_max() + 1))),
  -    Type = {range, {integer, 0}, {integer, 16#10ffff}},
  -    NewSize = erlang:max(1, (Size - ListLength) div ListLength),
  -    RandString = [create_value(Type, NewSize, ParseState) || _ <- lists:seq(1, ListLength)],
  +    RandStringFun =
  +        fun() ->
  +                ListLength0 = crypto:rand_uniform(list_length_min(),
  +                                                  list_length_max() + 1),
  +                ListLength = erlang:max(1, erlang:min(Size, ListLength0)),
  +                Type = {range, {integer, 0}, {integer, 16#10ffff}},
  +                NewSize = erlang:max(1, (Size - ListLength) div ListLength),
  +                [create_value(Type, NewSize, ParseState) || _ <- lists:seq(1, ListLength)]
  +        end,
       create_val_50rand_50coll(
         ParseState, fun tester_parse_state:get_non_empty_strings/1,
  -      RandString);
  +      RandStringFun);
   create_value(integer, _Size, ParseState) ->
       create_val_50rand_50coll(
         ParseState, fun tester_parse_state:get_integers/1,
  -      crypto:rand_uniform(integer_min(), integer_max() + 1));
  +      fun() -> crypto:rand_uniform(integer_min(), integer_max() + 1) end);
   % 1..
   create_value(pos_integer, _Size, ParseState) ->
       create_val_50rand_50coll(
         ParseState, fun tester_parse_state:get_pos_integers/1,
  -      crypto:rand_uniform(1, integer_max() + 1));
  +      fun() -> crypto:rand_uniform(1, integer_max() + 1) end);
   % 0..
   create_value(non_neg_integer, _Size, ParseState) ->
       create_val_50rand_50coll(
         ParseState, fun tester_parse_state:get_non_neg_integers/1,
  -      crypto:rand_uniform(0, integer_max() + 1));
  +      fun() -> crypto:rand_uniform(0, integer_max() + 1) end);
   create_value({integer, Value}, _Size, _ParseState) ->
       Value;
   create_value({atom, Value}, _Size, _ParseState) ->
  
positive.code: create_value(atom, _Size, ParseState) ->
      create_val_50rand_50coll(
        ParseState, fun tester_parse_state:get_atoms/1,
        lists:nth(crypto:rand_uniform(1, 5), [one, two, three, four]));
  create_value(float, _Size, ParseState) ->
      create_val_50rand_50coll(
        ParseState, fun tester_parse_state:get_floats/1,
        crypto:rand_uniform(-5, 5) * (crypto:rand_uniform(0, 30323) / 30323.0));
  create_value({range, {integer, Low}, {integer, High}}, _Size, _ParseState) ->
      crypto:rand_uniform(Low, High + 1);
  create_value({union, Types}, Size, ParseState) ->
  
negative.code: create_value(binary, Size, ParseState) ->
      create_val_50rand_50coll(
        ParseState, fun tester_parse_state:get_binaries/1,
        fun() -> list_to_binary(create_value({list, {range, {integer, 0}, {integer, 16#ff}}}, Size, ParseState)) end);
  create_value(bool, _Size, _ParseState) ->
      case crypto:rand_uniform(0, 2) of
          0 -> false;
  