এখানে আমরা C++-এ shuffle এবং random_shuffle দেখব। প্রথমে random_shuffle দেখি। এটি [left, right) রেঞ্জের এলিমেন্টগুলো র্যান্ডমলি রি-অ্যারেঞ্জ করতে ব্যবহৃত হয়। এই ফাংশন প্রতিটি এলিমেন্টের পজিশন যেকোনো র্যান্ডমলি চয়ন করা পজিশনের সাথে স্ব্যাপ করে।
আমরা কিছু র্যান্ডম জেনারেটর ফাংশন দিয়ে বোঝাতে পারি প্রতিটি কেসে কোন এলিমেন্ট নেওয়া হবে। যদি না দেই, তবে এটি নিজস্ব র্যান্ডম জেনারেটর ফাংশন ব্যবহার করে।
উদাহরণ কোড (random_shuffle)
#include <bits/stdc++.h>
using namespace std;
int myRandomGenerator(int j) {
return rand() % j;
}
int main() {
srand(unsigned(time(0)));
vector<int> arr;
for (int j = 1; j < 20; ++j) // ২০টি নম্বর জেনারেট করে ভেক্টরে যোগ
arr.push_back(j);
random_shuffle(arr.begin(), arr.end()); // বিল্ট-ইন র্যান্ডম ফাংশন ব্যবহার করে শাফল
cout << "arr elements:";
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
cout << ' ' << *i;
cout << endl;
// myRandomGenerator ব্যবহার
random_shuffle(arr.begin(), arr.end(), myRandomGenerator);
cout << "arr elements:";
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
cout << ' ' << *i;
cout << endl;
}
আউটপুট
arr elements: 5 14 15 6 3 16 13 12 10 2 4 1 17 9 18 11 7 8 19 arr elements: 8 10 5 6 14 1 15 3 19 16 13 18 7 9 4 12 11 17 2
এখন shuffle() ফাংশন দেখি। এটি ও [left, right) রেঞ্জের এলিমেন্টগুলো র্যান্ডমলি রি-অ্যারেঞ্জ করে। এটি একটি ইউনিফর্ম র্যান্ডম নম্বর জেনারেটর নেয়।
উদাহরণ কোড (shuffle)
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> arr;
unsigned seed = 0;
for (int j = 1; j < 20; ++j) // ২০টি নম্বর জেনারেট করে ভেক্টরে যোগ
arr.push_back(j);
shuffle(arr.begin(), arr.end(), default_random_engine(seed));
cout << "arr elements:";
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
cout << ' ' << *i;
cout << endl;
}
আউটপুট
arr elements: 19 7 5 6 12 4 13 3 1 17 11 14 18 2 8 15 9 10 16
random_shuffle() এবং shuffle() এর একমাত্র পার্থক্য হলো: random_shuffle() র্যান্ডম ইনডেক্স জেনারেট করতে rand() ফাংশন ব্যবহার করে, আর shuffle() ইউনিফর্ম র্যান্ডম নম্বর জেনারেটর ব্যবহার করে। যদিও, যদি আমরা random_shuffle()-এর সাথে ইউনিফর্ম র্যান্ডম নম্বর জেনারেটর পাস করি, তবে একই রকম ফলাফল পাওয়া যাবে।