Terry,
This happens because all objects created by the process are accumulated in the context. When the system needs a Contact to assign to a RegularUser it pick up one from the context, which happens to be the first one.
You have a couple of options. One is to create each pair of objects in a separate process. All of these separate processes can be called from the main process. When each of these processes finishes the context created for that process is discarded, so when the next one starts it will have the context copied from the main process.
The other option is to import objects from files rather than create them in a process. There would be 3 files to import: Contacts, RegularUsers and the relationships between them. The relationship file contains attribute values that uniquely identify instances to be linked, for example:
RegularUser.LoginName, RegularUser.Contact.FirstName, RegularUser.Contact.LastName
'sp1', 'John', 'Brown'
and can be imported by the following rule:
IMPORT RELATIONSHIPS OF RegularUser FROM 'c:/user_contact.csv'