博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
random_shuffle函数
阅读量:4030 次
发布时间:2019-05-24

本文共 1337 字,大约阅读时间需要 4 分钟。

        上次写遗传算法用到STL里的random_shuffle函数,算法的主要思想在《计算机程序设计艺术》的3.4.2节有详细的分析,现在这里简单说明一下算法的实现。

应包含头文件:

        #include<algorithm>

函数原型:

SGI版本一

template 
inline void random_shuffle(RandomAccessIterator first, RandomAccessIterator last) { __random_shuffle(first, last, distance_type(first));}template
void __random_shuffle(RandomAccessIterator first, RandomAccessIterator last, Distance*) { if (first == last) return; for (RandomAccessIterator i = first + 1; i != last; ++i)#ifdef __STL_NO_DRAND48 //DRAND48和LRAND48都是基于均匀分布区间上的随机函数 iter_swap(i, first + Distance(rand() % ((i - first) + 1)));#else iter_swap(i, first + Distance(lrand48() % ((i - first) + 1)));#endif}
SGI版本二

template 
void random_shuffle(RandomAcessIterator first, RandomAcessIterator last, RandomNumberGenerator& rand){//注意rand应为引用参数 if (first == last) return; for (RandomAcessIterator i = first + 1; i != last; ++i) iter_swap(i, first + rand((i - first) + 1));}
函数功能:

        将[first,last)的元素次序随机重排。N个元素的排列方式共有N!种,random_shuffle会产生一个均匀分布,因此任何一个排列被选中的概率为1/N!。

简单实例:

#include
#include
#include
int main(){ std::vector
vec; for (int i = 0; i < 10; ++i){ vec.push_back(i); } random_shuffle(vec.begin(), vec.end()); for (int i = 0; i < 10; ++i){ std::cout << vec[i] << " "; }}

输出:        8 1 9 2 0 5 7 3 4 6

转载地址:http://urebi.baihongyu.com/

你可能感兴趣的文章
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>
/dev/input/event0 键盘输入
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
输入设备节点自动生成
查看>>
opencv test code-1
查看>>
eclipse 导入先前存在的项目
查看>>
GNU hello代码分析
查看>>