换位置法
基本思路是:先初始化一串分布的数字,然后为每个位置依次生成一个与之交换的随机位置,如果生成的随机位置不是它本身就执行交换操作。
实现代码:
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;
}
比较:在时间上快好多,因为交换位置的次数的最大值是限定了的(生成随机数的次数是固定的),而且省去了查找新生成数是否在已生成数中的时间。方法一中,当新生成的数在已生成的数中就需要从新生成一个随机数,从而随机生成数的次数是不固定的(有最小值)。