title: How to use tf dataset sharding AFTER a shuffle operation, but not repeat entries
body: <p>I am trying to solve the following problem:
  I have 128 files that I want to break into 4 subsets. Each time around, I want the division to be different.</p>
  <p>If I do <code>tf.data.Dataset.list_files('glob_pattern', shuffle=False)</code>, the dataset has the right number of files. Sharding this works as expected, but each shard only ever has the same files.</p>
  <p>I want to shard and end up with a different division of the files each go-through the data. However, if I turn <code>shuffle=True</code>, then each shard seems to have its own copy of the original dataset, meaning that I can see the same file multiple times before seeing all the files once.</p>
  <p>Is there an idiomatic way of splitting these files?</p>
  <p>Basically, I'm wondering why the original <code>list_files</code> dataset is able to have some files show up multiple times before all the files have been seen.</p>
  <p>Here is some TF2.0 code to see the problem:</p>
  <pre><code>ds = tf.data.Dataset.from_tensor_slices([f'train_{str(i).zfill(5)}' for i in range(128)])
  ds = ds.shuffle(128)
  
  n_splits = 4
  sub_datasets = [ds.shard(n_splits, i) for i in range(n_splits)]
  
  output = [] 
  
  # go through each of the subsets 
  for i in range(n_splits): 
      results = [x.numpy().decode() for x in sub_datasets[i]]
      output.extend(results)
  
  print(len(set(output)), 'is the number of unique files seen (128 desired)')
  </code></pre>