docs: def sample(self, num):
          """
          Returns a new table with rows randomly sampled.
  
          We create a mask with `num` True bools, and fill it with False bools
          until it is the length of the table. We shuffle it, and apply that
          mask to the table.
          """
          if num > len(self):
              return self.copy()
          elif num < 0:
              raise IndexError("Cannot sample a negative number of rows "
                               "from a DataTable")
  
          random_row_mask = ([True] * num) + ([False] * (len(self) - num))
          shuffle(random_row_mask)
  
          sampled_table = self.mask(random_row_mask)
          random_col_name = 'random_sorting_column'
          while random_col_name in sampled_table:
              random_col_name = '%030x' % randrange(16**30)
          sampled_table[random_col_name] = [random()
                                            for _ in xrange(len(sampled_table))]
          sampled_table.sort(random_col_name, inplace=True)
          del sampled_table[random_col_name]
          return sampled_table