I have two vectors:
vector1 = [1 2 3 4 5 6 7 8 9]
vector2 = [1 2 3 4 5 6 7 8 9]
I want to ensure, that when I shuffle both using random_shuffle they should be shuffled in the same corresponding order. For example:
Output after shuffling should be like:
vector1 = [1 9 3 4 2 7 8 5 6]
vector2 = [1 9 3 4 2 7 8 5 6]
But I am getting output like:
vector1 = [5 1 7 4 2 3 9 8 6]
vector2 = [3 4 1 9 8 2 5 7 6]
Heres my code:
int main ()
{
std::srand ( unsigned ( std::time(0) ) );
std::vector<int> vector1, vector2;
// set some values:
for (int i=1; i<10; ++i)
{
vector1.push_back(i);
vector2.push_back(i);
}
// using built-in random generator:
std::random_shuffle ( vector1.begin(), vector1.end() );
std::random_shuffle ( vector2.begin(), vector2.end() );
// print out content:
std::cout << "vector1 contains:";
for ( std::vector<int>::iterator it1 = vector1.begin(); it1 != vector1.end(); ++it1 )
std::cout << ' ' << *it1;
std::cout << '\n';
std::cout << '\n';
std::cout << "vector2 contains:";
for ( std::vector<int>::iterator it2 = vector2.begin(); it2 != vector2.end(); ++it2 )
std::cout << ' ' << *it2;
std::cout << '\n';
std::cout << '\n';
return 0;
}
EDIT This is an example case that I tried to implement. In practise, I have one vector of images and one vector of corresponding labels. I need them to be shuffled in the same manner. Could anybody please help...... thanks a lot!!
Instead of shuffling the vectors themselves, shuffle a vector of indexes into the other vectors. Since you'll be using the same indexes for both, they're guaranteed to be in the same order.
std::vector<int> indexes;
indexes.reserve(vector1.size());
for (int i = 0; i < vector1.size(); ++i)
indexes.push_back(i);
std::random_shuffle(indexes.begin(), indexes.end());
std::cout << "vector1 contains:";
for ( std::vector<int>::iterator it1 = indexes.begin(); it1 != indexes.end(); ++it1 )
std::cout << ' ' << vector1[*it1];
Make sure you use the same seed for both calls to random_shuffle()
:
auto seed = unsigned ( std::time(0) );
// ...
std::srand ( seed );
std::random_shuffle ( vector1.begin(), vector1.end() );
std::srand ( seed );
std::random_shuffle ( vector2.begin(), vector2.end() );
Notice, however, that the Standard does not specify that random_shuffle()
should use the rand()
function to generate a random permutation - this is implementation-defined. Therefore, srand()
will not affect the result of random_shuffle()
on implementations that do not use rand()
.
Paragraph 25.3.12/4 of the C++11 Standard on random_shuffle()
specifies:
Remarks: To the extent that the implementation of these functions makes use of random numbers, the implementation shall use the following sources of randomness:
The underlying source of random numbers for the first form of the function is implementation-defined. An implementation may use the
rand
function from the standard C library. [...]
Therefore, if you want to make sure you are writing portable code, use the version of random_shuffle()
that accepts a random number generator as a third argument, so that you have control over the seeding.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With