random_shuffle()函数第三个参数的问题

shuaiwang_01 2009-06-11 02:49:07
看到一个STL的例子,我在VS里面运行

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <functional>
using namespace std;

int iArray[10] = {10, 2, 2, 14, 5, 6, 74, 29, 9, 101};
vector<int> v(iArray, iArray + 10);

void Display(vector<int> &v, const char* s)
{
cout<<s<<endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, "\t"));
cout<<endl;
}

unsigned int RandInt(const unsigned int n)
{
return rand() % n;
}

int main()
{
srand((unsigned int)time(NULL));
Display(v, "Before shuffle:");
pointer_to_unary_function<unsigned int, unsigned int> ptr_RandInt = ptr_fun(RandInt);
random_shuffle(v.begin(), v.end(), ptr_RandInt);
Display(v, "After shuffle:");
return 0;
}

当我把random_shufflev()函数写为random_shuffle(v.begin(), v.end())时也会乱序,且每次不同,那第三个参数到底是干什么用的,要不要好像无所谓。
...全文
827 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈哈王戈多 2011-07-07
  • 打赏
  • 举报
回复
class MyRand
{public:int operator()(int index)
{return rand() % POKER_NUM;}//返回0--51之间的数据。
};
然后random_shuffle(poker.begin(), poker.end(), MyRand());后,为什么没有出现1楼说的像出现0--51之间的数字?依1楼所说,应该出现的数是[1,50],但是事实结果并不是这样,求解释,还是我自己搞错了呢?
王旺旺旺 2009-11-15
  • 打赏
  • 举报
回复
我也是研究了STL的源代码才看懂 random_shuffle 到底怎么用的。
建议lz好好研究一下
superyys 2009-06-11
  • 打赏
  • 举报
回复
哈哈,,以后写棋牌程序洗牌不用自己写啦,,用STL这个通用算法就OK了
liao05050075 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shuaiwang_01 的回复:]
谢谢三楼,但想问一下:
unsigned int RandInt(const unsigned int n)
{
return rand() % n;
}
这个函数岂不是跟系统默认的没什么区别,它这个参数n到底是谁传进来的,传进来之后发生了什么,为什么可以打乱?
再者就是如何实现你所说的“较大概率是前1/3和末1/3的元素发生交换”?
[/Quote]

上面这个函数确实跟系统没什么分别,它只是举例说你可以用自己的随机数发生器而已。
n是由random_shuffle()传入的,传入之后你的随机数发生器就可以根据它产生一个新的下标x,然后传x回random_shuffle,
random_shuffle就把下标为n和x的两数交换。于是就打乱了。
这个你可以试试
class MyRand
{
public:
int operator()(int index)
{
return index;
}
};
你就会发现,数组没有打乱(因为它总是自己跟自己交换。)

至于如何实现“较大概率是前1/3和末1/3的元素发生交换”。这个可就要好好想想才行了。在这里只是举个例子,没想过怎么实现。呵呵
shuaiwang_01 2009-06-11
  • 打赏
  • 举报
回复
谢谢三楼,但想问一下:
unsigned int RandInt(const unsigned int n)
{
return rand() % n;
}
这个函数岂不是跟系统默认的没什么区别,它这个参数n到底是谁传进来的,传进来之后发生了什么,为什么可以打乱?
再者就是如何实现你所说的“较大概率是前1/3和末1/3的元素发生交换”?
liao05050075 2009-06-11
  • 打赏
  • 举报
回复
第三个参数的意义就是你可以使用自己定义的随机数发生器。

比如说你有一个更好的随机数发生器,或者说你有一个适合自己应用的随机数发生器,那么你就可以使用它而不是使用系统默认那个。
例如:你希望你的random_shuffle的结果有较大概率是前1/3和末1/3的元素发生交换,那么你就得自己写一个随机数发生器并使用它。
shuaiwang_01 2009-06-11
  • 打赏
  • 举报
回复
一楼的朋友,这个我也搜到过,但就是不明白第三个参数的意义。
liao05050075 2009-06-11
  • 打赏
  • 举报
回复
random_shuffle 的第三个参数,需要的是一个函数对象, 这个函数对象的参数是算法遍历序列时的index,返回值是0-X 之间的一个随机数,这个 X 可由用户来决定。默认的random_shuffle中, 被操作序列的index 与 rand()%index 两个位置的值交换,来达到乱序的目的。

#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>

using namespace std;

const int POKER_NUM = 52; //52张扑克牌

void print_poker(int PokerNum)
{
cout << PokerNum << " ";
}

class MyRand
{
public:
int operator()(int index)
{
return rand() % POKER_NUM;
}
};

int main()
{
srand( (unsigned)time(NULL) ); //设置随即数生成器的种子

vector<int> poker; //一副牌,牌点数从 1 计

//初始化
for (int num = 0; num < POKER_NUM; ++num)
{
poker.push_back(num+1);
}

//用默认随机数洗一遍
random_shuffle(poker.begin(), poker.end());
for_each(poker.begin(), poker.end(), print_poker);
cout << endl;

//用自定义随机数再洗一遍
random_shuffle(poker.begin(), poker.end(), MyRand());
copy(poker.begin(), poker.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>

using namespace std;

const int POKER_NUM = 52; //52张扑克牌

void print_poker(int PokerNum)
{
cout << PokerNum << " ";
}

class MyRand
{
public:
int operator()(int index)
{
return rand() % POKER_NUM;
}
};

int main()
{
srand( (unsigned)time(NULL) ); //设置随即数生成器的种子

vector<int> poker; //一副牌,牌点数从 1 计

//初始化
for (int num = 0; num < POKER_NUM; ++num)
{
poker.push_back(num+1);
}

//用默认随机数洗一遍
random_shuffle(poker.begin(), poker.end());
for_each(poker.begin(), poker.end(), print_poker);
cout << endl;

//用自定义随机数再洗一遍
random_shuffle(poker.begin(), poker.end(), MyRand());
copy(poker.begin(), poker.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aheroofeast/archive/2009/02/18/3907192.aspx

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧