换位置法

基本思路是:先初始化一串分布的数字,然后为每个位置依次生成一个与之交换的随机位置,如果生成的随机位置不是它本身就执行交换操作。

实现代码:

void swap(int& a, int& b) 
{ 
    a = a^b; 
    b = a^b; 
    a = a^b; 
} 

size_t shuffle2(int s[], int n) 
{ 
    size_t t=0;//计算循环次数 
    for (int i=0; i<n; i++) 
    { 
        t++; 
        s[i] = i; 
    } 
    for (int i=0; i<n; i++) 
    { 
        t++; 
        int num = rand()%n; 
        if (num != i) 
        { 
            swap(s[num],s[i]); 
        } 
    } 
    return t; 
} 

void printCards2(int s[], int n) 
{ 
    for (int i=0; i<n; i++) 
    { 
        cout << s[i] << " "; 
    } 
    cout << endl; 
}

比较:在时间上快好多,因为交换位置的次数的最大值是限定了的(生成随机数的次数是固定的),而且省去了查找新生成数是否在已生成数中的时间。方法一中,当新生成的数在已生成的数中就需要从新生成一个随机数,从而随机生成数的次数是不固定的(有最小值)。