1.洗牌算法
假定有个数组,含有n个元素,假定有个方法shuffle(...)对n-1个元素有效,我们用它来打乱n个元素的次序。
我们会先打乱前n-1个元素的次序,然后取出地n个元素,将它与数组中的元素随机交换。
递归解法的算法如下:
int Rand(int low, int high)
{
return low + rand() % (high - low + 1);
}
vector<int>shuffleArray1(vector<int>a, int i) {
if (i == 0)return a;
shuffleArray1(a,i-1);
int k = Rand(0,i);
int temp = a[k];
a[k] = a[i];
a[i] = temp;
return a;
}
迭代法实现如下:
int Rand(int low, int high)
{
return low + rand() % (high - low + 1);
}
void shuffleArray2(vector<int>&a)
{
for (int i = 0; i < a.size(); i++) {
int k = Rand(0,i);
int temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
2.rand5()实现rand()7
给定rand5(),实现一个方法rand7()。也即,给定一个产生0到4(含)随机数的方法,编写一个产生0到6(含)随机数的方法。
解法
int rand7()
{
while(true){
int num = 5*rand5()+rand5();
if(num < 21) {
return num%7;
}
}
}
int rand7()
{
while(true){
int r1=2*rand5();
int r2=rand5();
if(r2!=4){
int rand1=r2%2;
int num=r1+rand1;
if(num<7)
return num;
}
}
}