The intention of the dp is to do exactly that. Run a set of steps with different data. You are running the testcase in 3 browsers and with 3 data. So each browwser would run with each of the 3 data. That is expected.
If you want that one data should go to one browser then the browser too should be passed as part of the dataprovider. So data1 with browser1, data2 with browser2 and data3 with browser 3 - this would ensure each browser runs with one data.
In your flow, it seems you are testing registration thrice. The design seems to be incorrect from whatever you mention.