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
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.