您的位置:首页 > 其它

洗牌程序的两种实现方法比较

2014-12-30 15:54 309 查看
本文是转载的,链接:http://www.cnblogs.com/hanxi/archive/2012/10/15/2725047.html

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


因为"第1次移动后,第1个数还在第1个位置的概率是1/n,后续移动只会减少这个概率。所以这个算法不是完全随机的"。修改后的算法其实就是使用C++的STL<algorithm>库中的random_shuffle()函数的实现方法。取随机数的时候的范围每次都随着i的改变而变动,这样就不会减少之前的位置的数还是原来的数的概率了(即后续交换操作不会影响到已经交换过的位置)。

使用标准库<algorithm>中的random_shuffle()函数实现很简单,代码如下:

int main()
{
vector<int> s_stl;
for (int i=0; i<CARDS_COUNT; ++i) s_stl.push_back(i);
random_shuffle(s_stl.begin(),s_stl.end());
cout << "使用C++算法库:";
for (vector<int>::iterator it=s_stl.begin(); it!=s_stl.end(); ++it)
cout << " " << *it;
return 0;
}




我看了它的实现,随机的时候取的随机数是rand()%(i+1)


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  random