def random_string(max_len=1, min_len=1, chars=string.ascii_letters, **kwargs):
        """
        :param max_len: max value of len(string)
        :param min_len: min value of len(string)
        :param chars: can be sting, list of strings or function pointer.
        Randomly choose one if given a list of strings
        :param kwargs: keyword arguments for chars if it's function pointer
        :return: SeedString()
        """
        if isinstance(chars, list):
            # assume each element is a str
            chars = ''.join(chars)

        if isinstance(chars, str):
            return SeedString(
                ''.join(random.choice(chars) for _ in range(random.randint(min_len, max_len))))
        elif isfunction(chars):
            # this function is assumed to return/generate one character each time it is called
            return SeedString(
                ''.join(chars(**kwargs) for _ in range(random.randint(min_len, max_len))))
        else:
            raise ValueError("chars should be string, list, or function pointer")
:param max_len: max value of len(string)
        :param min_len: min value of len(string)
        :param chars: can be sting, list of strings or function pointer.
        Randomly choose one if given a list of strings
        :param kwargs: keyword arguments for chars if it's function pointer
        :return: SeedString()