docs: def sample(self, start_state=None, size=1, return_type="dataframe"):
          """
          Sample from the Markov Chain.
  
          Parameters:
          -----------
          start_state: dict or array-like iterable
              Representing the starting states of the variables. If None is passed, a random start_state is chosen.
          size: int
              Number of samples to be generated.
          return_type: string (dataframe | recarray)
              Return type for samples, either of 'dataframe' or 'recarray'.
              Defaults to 'dataframe'
  
          Returns
          -------
          sampled: A pandas.DataFrame or a numpy.recarray object depending upon return_type argument
              the generated samples
  
          Examples:
          ---------
          >>> from pgmpy.factors import DiscreteFactor
          >>> from pgmpy.sampling import GibbsSampling
          >>> from pgmpy.models import MarkovModel
          >>> model = MarkovModel([('A', 'B'), ('C', 'B')])
          >>> factor_ab = DiscreteFactor(['A', 'B'], [2, 2], [1, 2, 3, 4])
          >>> factor_cb = DiscreteFactor(['C', 'B'], [2, 2], [5, 6, 7, 8])
          >>> model.add_factors(factor_ab, factor_cb)
          >>> gibbs = GibbsSampling(model)
          >>> gibbs.sample(size=4, return_tupe='dataframe')
             A  B  C
          0  0  1  1
          1  1  0  0
          2  1  1  0
          3  1  1  1
          """
          if start_state is None and self.state is None:
              self.state = self.random_state()
          elif start_state is not None:
              self.set_start_state(start_state)
  
          types = [(var_name, 'int') for var_name in self.variables]
          sampled = np.zeros(size, dtype=types).view(np.recarray)
          sampled[0] = tuple([st for var, st in self.state])
          for i in range(size - 1):
              for j, (var, st) in enumerate(self.state):
                  other_st = tuple(st for v, st in self.state if var != v)
                  next_st = sample_discrete(list(range(self.cardinalities[var])),
                                            self.transition_models[var][other_st])[0]
                  self.state[j] = State(var, next_st)
              sampled[i + 1] = tuple([st for var, st in self.state])
  
          return _return_samples(return_type, sampled)