docs: def sample(self, start_state=None, size=1):
          """
          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:
          ------------
          pandas.DataFrame
  
          Examples:
          ---------
          >>> from pgmpy.models import MarkovChain as MC
          >>> from pgmpy.factors.discrete import State
          >>> model = MC(['intel', 'diff'], [2, 3])
          >>> model.set_start_state([State('intel', 0), State('diff', 2)])
          >>> intel_tm = {0: {0: 0.25, 1: 0.75}, 1: {0: 0.5, 1: 0.5}}
          >>> model.add_transition_model('intel', intel_tm)
          >>> diff_tm = {0: {0: 0.1, 1: 0.5, 2: 0.4}, 1: {0: 0.2, 1: 0.2, 2: 0.6 }, 2: {0: 0.7, 1: 0.15, 2: 0.15}}
          >>> model.add_transition_model('diff', diff_tm)
          >>> model.sample(size=5)
             intel  diff
          0      0     2
          1      1     0
          2      0     1
          3      1     0
          4      0     2
          """
          if start_state is None:
              if self.state is None:
                  self.state = self.random_state()
              # else use previously-set state
          else:
              self.set_start_state(start_state)
  
          sampled = DataFrame(index=range(size), columns=self.variables)
          sampled.loc[0] = [st for var, st in self.state]
  
          var_states = defaultdict(dict)
          var_values = defaultdict(dict)
          samples = defaultdict(dict)
          for var in self.transition_models.keys():
              for st in self.transition_models[var]:
                  var_states[var][st] = list(self.transition_models[var][st].keys())
                  var_values[var][st] = list(self.transition_models[var][st].values())
                  samples[var][st] = sample_discrete(var_states[var][st], var_values[var][st], size=size)
  
          for i in range(size - 1):
              for j, (var, st) in enumerate(self.state):
                  next_st = samples[var][st][i]
                  self.state[j] = State(var, next_st)
              sampled.loc[i + 1] = [st for var, st in self.state]
  
          return sampled