Property

Friday, December 5, 2014

Shuffle card algorithm

One common programming question is how to randomly shuffle an array of numbers in-place.

variant of question:-
How would you write code to shuffle a deck of cards?
                                                   OR
write a program to generate a random permutation of array elements.


let's try to understand problem:



algorithm:

1. Start iterating the array from the last element.
2. If you are at ith element from the end, generate a random number say j,in range[0,i].
3. Swap A[i] and A[j].
4. Decrease j by 1
5. Continue till you reach the element at index 1 i.e A[1].

Generalize code:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
     int a[] = {1, 2, 3, 4, 5, 6, 7, 8},temp,i, n = 8;
// A function to generate a random permutation of a[]
void randomize ( )
{

// srand()--> gives the random function a new seed, a starting point 
//(usually random numbers are calculated by taking the previous number 
//(or the seed) and then do many operations on that number to generate the next).
 
//time(0)--> gives the time in seconds since the Unix epoch, 
//which is a pretty good "unpredictable" seed 
//(you're guaranteed your seed will be the same only once, 
//unless you start your program multiple times within the same second).
    srand ( time(NULL) );
 
    //We don't need to run for the first element that's why n-1 pass
    
    for ( i = n-1; i > 0; i--) //for Shuffle card algorithm i=51
    {
        // Pick a random index from 0 to i
        int j = rand() % (i+1);
 
        // Swap a[i] with the element at random index
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
    }
}
 
int main()
{
 // shuffle the array
    randomize ();
  // print results.
     for ( i = 0; i < n; i++)
        printf("%d ", a[i]);
    return 0;
}


output:-
8 1 5 4 6 2 3 7

time complexity:-  O(n)
time complexity to traverse array is o(n) and assume rand() generates random number in O(1) time.

code for  shuffle deck of cards: 
we have to make change in input and array size of above generalize algorithm.input array consist of 52 cards
          int a[] ={  1,2,3,4,5,6,7,8,9,10,11,12,13,
                      14,15,16,17,18,18,20,21,22,23,24,25,26,
                      27,28,29,30,31,32,33,34,35,36,37,38,39,
                      40,41,42,43,44,45,46,47,48,49,50,51,52
                   };
change value of n
int n=52  // array size 
final code for  shuffle deck of cards:  :
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
// Clubs->1 to 13
//Diamonds->14 to 26
//Hearts->27 to 39
//Spades->40 to 52
 int a[] ={ 1,2,3,4,5,6,7,8,9,10,11,12,13,
            14,15,16,17,18,18,20,21,22,23,24,25,26,
            27,28,29,30,31,32,33,34,35,36,37,38,39,
            40,41,42,43,44,45,46,47,48,49,50,51,52
          };
 int temp,i, n = 52;
// A function to generate a random permutation of a[]
void randomize ( )
{
 
// srand()--> gives the random function a new seed, a starting point 
//(usually random numbers are calculated by taking the previous number 
//(or the seed) and then do many operations on that number to generate the next).
  
//time(0)--> gives the time in seconds since the Unix epoch, 
//which is a pretty good "unpredictable" seed 
//(you're guaranteed your seed will be the same only once, 
//unless you start your program multiple times within the same second).
    srand ( time(NULL) );
  
    //We don't need to run for the first element that's why n-1 pass
     
    for ( i = n-1; i > 0; i--) //for Shuffle card algorithm i=51
    {
        // Pick a random index from 0 to i
        int j = rand() % (i+1);
  
        // Swap a[i] with the element at random index
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
    }
}
  
int main()
{
 // shuffle the array
    randomize ();
  // print results.
     for ( i = 0; i < n; i++)
        printf("%d ", a[i]);
    return 0;
}
output:-
29 8 47 10 49 28 24 43 14 13 48 32 2 12 
36 31 30 18 50 1 25 41 40 45 39 38 6 35
23 17 9 46 20 11 51 52 4 34 42 15 22 7 
37 33 18 3 5 16 27 26 21 44



0 comments:

All Rights Reserved. 2014 Copyright SIMPLITONA

Powered By Blogger | Published By Gooyaabi Templates Designed By : BloggerMotion

Top