Fisher Yates Karıştırma Algoritması
-
#include <iostream>
#include <conio.h> // getch()
using namespace std;
void shuffle(int a[],int size)
{
int tmpa, tmpb;
int random;
srand(time(NULL));
while (size > 0)
{
random = rand()%size; // dizi boyutunun random değer alır
tmpa = a[size-1]; // değişkene dizideki en son elemanı atar
tmpb = a[random]; // dizideki random değişkenin değerindeki sırada olan rakamı değişkene atar
a[size-1] = tmpb; // takas et
a[random] = tmpa; // takas et
size = size-1;
}
}
int main()
{
const int SIZE = 20;
int arr[SIZE]= {0};
for (int j=0;j < SIZE;j++)
{ arr[j] = j+1; }
shuffle(arr,SIZE);
for (int f=0;f < SIZE;f++)
{ cout << arr[f] << endl; }
getch();
return EXIT_SUCCESS;
}
Merhaba,şöyle kısa bir doküman niteliğinde bir şey paylaşıyım.Kod c++ ile yazılmıştır.Shuffle fonksiyonu namı diğer fisher yates karıştırma algoritması olarak geçer,merak edenler için wiki: http://en.wikipedia.org/wiki/Fisher–Yates_shuffle
Peki ne yapar bu kod ? Çalışma mantığı nedir ?
Mesela rakamlardan oluşan bir dizimiz var bu kod ile rakamları karıştırabiliriz.Ya da rakamlardan oluşan bir dizi oluşturmak istiyoruz ama bütün rakamlardan en fazla 1 tane olacak.Bu problemin çözümü için şöyle bir algoritma oluşturabiliriz.Ben diziye 1 den x’e kadar değerler atıyım sonra bu diziyi karıştırayım al sana bütün rakamlardan bir tane karışık dizi.
Algoritma diziden rastgele bir rakam seçer bunla başka bir rakamın yerini değiştirir(tekrar sayısı = dizi boyutu)bu şekilde tüm dizi karışmış olur.
Umarım anlamışsınızdır :)
