洗牌程序的两种实现方法比较
2014-12-30 15:54
309 查看
本文是转载的,链接:http://www.cnblogs.com/hanxi/archive/2012/10/15/2725047.html
因为"第1次移动后,第1个数还在第1个位置的概率是1/n,后续移动只会减少这个概率。所以这个算法不是完全随机的"。修改后的算法其实就是使用C++的STL<algorithm>库中的random_shuffle()函数的实现方法。取随机数的时候的范围每次都随着i的改变而变动,这样就不会减少之前的位置的数还是原来的数的概率了(即后续交换操作不会影响到已经交换过的位置)。
使用标准库<algorithm>中的random_shuffle()函数实现很简单,代码如下:
![](http://pic002.cnblogs.com/images/2012/198486/2012101523284938.png)
我看了它的实现,随机的时候取的随机数是rand()%(i+1)
![](http://pic002.cnblogs.com/images/2012/198486/2012101522493785.jpg)
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; }
![](http://pic002.cnblogs.com/images/2012/198486/2012101523284938.png)
我看了它的实现,随机的时候取的随机数是rand()%(i+1)
![](http://pic002.cnblogs.com/images/2012/198486/2012101522493785.jpg)
相关文章推荐
- 洗牌程序的两种实现方法比较
- 比较洗牌算法的两种实现方法
- java实现多线程的两种方法的比较
- 用PHP程序实现支持页面后退的两种方法
- C#实现SQL SERVER数据库备份的两种方法比较
- java实现多线程两种方法的比较
- 用PHP程序实现支持页面后退的两种方法
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- java 卖票程序的两种实现方法
- 转:实例学习PHP程序对用户身份认证实现两种方法
- 实现自定义对话框程序快捷键的两种方法
- C#实现Singleton的两种方法的比较
- 实现自定义对话框程序快捷键的两种方法
- 实现igoogle效果的两种方法比较
- 比较两种方法实现数据统计效果
- 用PHP程序实现支持页面后退的两种方法
- PHP程序实现支持页面后退的两种方法
- 实现自定义对话框程序快捷键的两种方法
- 两种方法实现类似微博好友查找的道指令程序
- Oracle中spool命令实现的两种方法比较