Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // (C) 2012 Tim Gurto
- #include <iostream>
- #include <cassert>
- #include <cmath>
- #include <cstdlib>
- #include <ctime>
- #include <list>
- double correlation(int *xData, int *yData, int size){
- assert(size > 0);
- //calculate means
- double xMean = 0, yMean = 0;
- for (int i = 0; i != size; ++i){
- xMean += xData[i];
- yMean += yData[i];
- }
- xMean /= size;
- yMean /= size;
- //calculate sums
- double
- sumXX = 0,
- sumYY = 0,
- sumXY = 0;
- for (int i = 0; i != size; ++i){
- double
- xDiff = xData[i] - xMean,
- yDiff = yData[i] - yMean;
- sumXX += xDiff * xDiff;
- sumYY += yDiff * yDiff;
- sumXY += xDiff * yDiff;
- }
- return sumXY / sqrt(sumXX * sumYY);
- }
- void bubbleShuffle(int *data, int size){
- for (int i = 0; i != size-1; ++i)
- for (int j = 0; j != size-1-i; ++j)
- if (rand() % 2){
- int temp = data[j];
- data[j] = data[j+1];
- data[j+1] = temp;
- }
- }
- void selectionShuffle(int *data, int size){
- //copy into list
- std::list<int> list;
- for (int i = 0; i != size; ++i)
- list.push_back(data[i]);
- //select back to array
- for (int i = 0; i != size; ++i){
- //navigate to random element
- int n = rand() % list.size();
- std::list<int>::const_iterator it = list.begin();
- while (n-- > 0)
- ++it;
- data[i] = *it;
- list.erase(it);
- }
- }
- double testShuffle(void (*shuffleFun)(int *data, int size)){
- const static int SIZE = 1000;
- const static int TESTS = 100;
- int data[SIZE];
- for (int i = 0; i != SIZE; ++i)
- data[i] = i;
- //tests
- double averageCorrelation = 0;
- for (int testNum = 0; testNum != TESTS; ++testNum){
- //shuffle
- int shuffledData[SIZE];
- for (int i = 0; i != SIZE; ++i)
- shuffledData[i] = i;
- shuffleFun(data, SIZE);
- //add correlation
- averageCorrelation += correlation(data, shuffledData, SIZE);
- }
- //average and return
- averageCorrelation /= TESTS;
- return 1 - abs(averageCorrelation);
- }
- int main(){
- srand(time(0));
- std::cout << " Bubble shuffle: " << testShuffle(bubbleShuffle) << std::endl;
- std::cout << "Selection shuffle: " << testShuffle(selectionShuffle) << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement