0

How to generate 256 random numbers without repeat?

I need to generate 256 random numbers in range 0-255 without repeating. I came up with many options and the numbers are constantly repeated. I usually compare in cycles. If the generated number matches the one already existing in the array, I again generate a new value in the same array element. And so on until you get 256 unique numbers. int newNums[256]; for(int i=0;i<256;i++){ newNums[i] = -1; } for(int el = 0; el<256;el++){ newNums[el] = rand() % 255; //earlier i use srand(time(0)) for(int pos=0, matches = 0; pos<=el; pos++){ if(newNums[el] == newNums[pos]){ matches++; if(matches > 1){ el--; break; } } } }

9th Jan 2021, 11:56 AM
Влад Цислевский
Влад Цислевский - avatar
3 Respuestas
+ 7
Doing it this way is very slow, because as the array fills up, you will get lots of duplicate numbers and waste a lot of loop cycles. A better approach would be to fill the array with the numbers and just shuffle it randomly afterwards. Here is an example making full use of STL features: https://code.sololearn.com/cO7vK5K9S5ya/?ref=app The sample() algorithm is actually very easy to implement, and you could do it yourself using rand() if you wish. As a reference, here is how the STL implements it: https://en.cppreference.com/w/cpp/algorithm/random_shuffle If the library implementation feels not understandable, feel free to ask again.
9th Jan 2021, 1:08 PM
Shadow
Shadow - avatar
+ 5
Влад Цислевский , what about the code you presented? Is it creating an error. Please give a clear description. Thanks!
9th Jan 2021, 1:03 PM
Lothar
Lothar - avatar
+ 3
Влад Цислевский Unfortunately, my messenger is not working correctly. Regarding your DM: std::iota is just a convenience function to fill the array. You might have to include <numeric> where it is actually defined: https://en.cppreference.com/w/cpp/algorithm/iota A simple for loop would do the job too.
9th Jan 2021, 3:09 PM
Shadow
Shadow - avatar