Hey Prashanth, let me try to explain a concept of dataset and dataloader in pytorch as I understand it.
Dataset is a whole set of your data points (samples) you want to iterate through during training. It defines a logic on how to access the sample at some index idx. Dataloader  - is a helper lets say from the smart guys  in the pytorch which is helping you to iterate through the data by batches of some batch_size and doing a lot of intrinsically to make it fast and efficient.
While doing next method on iterable object in Python you are basically looping through it and each next is producing the next sample from your iterable the same way as for sample in samples: doing it.
Then iterating through dataloader it will provide you with a next batch every iteration as the concept is “model wants to see all the data during epoch”. Even more so shuffle=True will make sure data is reshuffled before every epoch, so you’ll have batches in different order on the second epoch even if set seed manually.
As for reproducibility, dataloader instantiated second time with the same seed (lets say for the next experiment) will provide you with the same sequence of data samples as the first instance of dataloader.
Consider these examples.
Setup:
import torch
from torch.utils.data import TensorDataset, DataLoader
t = torch.arange(100)
ds = TensorDataset(t)

First I iterate through dataloader for 2 “epochs”:
dl = DataLoader(ds, batch_size=16, shuffle=True, generator=torch.manual_seed(0))
# iterate through dataloader first time, print first 3 yy's
print("first run through dl")
for i, yy in enumerate(dl):
    if i < 3:
        print(yy[0][:5])

# iterate through dataloader second time, print first 3 yy's
print("second run through dl")
for i, yy in enumerate(dl):
    if i < 3:
        print(yy[0][:5])

It prints this:
first run through dl
tensor([33, 70, 17, 63, 71])
tensor([90, 64, 11, 30, 91])
tensor([43, 31, 92, 94, 19])
secondrun through dl
tensor([15,  9, 50, 34, 51])
tensor([82, 70, 73, 13, 57])
tensor([89, 23, 36, 55, 84])

In the next snippet I instantiate dataloader two times:
dl = DataLoader(ds, batch_size=16, shuffle=True, generator=torch.manual_seed(0))
# iterate through dataloader first time, print first 3 yy's
print("first run through dl")
for i, yy in enumerate(dl):
    if i < 3:
        print(yy[0][:5])

# instantiate for next experiment
dl = DataLoader(ds, batch_size=16, shuffle=True, generator=torch.manual_seed(0))
# iterate through dataloader second time, print first 3 yy's
print("secondrun through dl")
for i, yy in enumerate(dl):
    if i < 3:
        print(yy[0][:5])

and it prints this:
first run through dl
tensor([33, 70, 17, 63, 71])
tensor([90, 64, 11, 30, 91])
tensor([43, 31, 92, 94, 19])
second run through dl
tensor([33, 70, 17, 63, 71])
tensor([90, 64, 11, 30, 91])
tensor([43, 31, 92, 94, 19])

It is a lengthy post, I know  But, hope it helps!