- 浏览: 227453 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
在STL的Algorithm中有着这样的一种算法:mutating algorithm,这一类算法的主要作用是改变Sequence Container中元素的顺序。而改变元素顺序的方法有好几个,如将元素反序(reverse),将元素位置循环旋转(rotate)等,而最吸引我的就是能够产生随机序列的方法了(random_shuffle)。
于是,我写了一段代码是试验一下这个方法:
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
void main()
{
vector<int> v1(10);
for(int j = 0; j < v1.size(); ++j)
v1[ j ] = j;
ostream_iterator<int> iter(cout, " ");
copy(v1.begin(), v1.end(), iter);
cout << " ";
random_shuffle(v1.begin(), v1.end());
copy(v1.begin(), v1.end(), iter);
cout << " ";
}
当我第一次执行的时候,哇,果然次序挺乱的哦。结果如下:
4 3 0 2 6 7 8 9 5 1
然后我满心欢喜的将程序再执行了一遍,咦,怎么那么像原来的序列呢?我反复运行了几次,结果让我很沮丧,因为产生的随机序列是一样的。为什么会这样呢?只能深入到random_shuffle方法里面去瞧瞧了,于是我又开始debug之旅。
在STL中的random-shuffle函数的实现是这样的:
inline void random_shuffle(_RI _F, _RI _L)
{
if (_F != _L)
_Random_shuffle(_F, _L, _Dist_type(_F));
}
template<class _RI, class _Pd>
inline void _Random_shuffle(_RI _F, _RI _L, _Pd *)
{
const int _RBITS = 15;
const int _RMAX = (1U << _RBITS) - 1;
_RI _X = _F;
for (_Pd _D = 1; ++_X != _L; ++_D)
{
unsigned long _Rm = _RMAX;
unsigned long _Rn = rand() & _RMAX;
for (; _Rm < _D && _Rm != ~0UL;
_Rm = _Rm << _RBITS | _RMAX)
_Rn = _Rn << _RBITS | _RMAX;
iter_swap(_X, _F + _Pd(_Rn % _D));
}
}
在random_shuffle的两个参数的版本中,我们可以发现这样的一个函数:_Dist_type(_F)。而在iterator类中,我看到了这样的代码:
inline ptrdiff_t *_Dist_type(const _Ty *)
{return ((ptrdiff_t *)0); }
在STDDEF.H文件中,我也找到ptrdiff的定义:typedef int ptrdiff_t。那么这个函数到底做了什么呢?不就是返回了一个 int *吗?而且值为00000000。更要命的是,传递进去之后,也没有地方使用啊,整个函数就在for循环出出现了_Pd,那么在这样的一段代码中,_Pd起到了怎样的作用呢?我觉得一点用处都没有。接下来的代码,由于在运行的时候,都没有改变通过srand改变随机数种子的话,得到的_Rn是恒定的,所以每次运行的结果都一样就不难理解了。现在我是知道了为什么得到的随机序列是一样的了,可是这个函数为什么要设计成这样呢?我能想到的就是为了随机序列能够被追溯吧。
为了能够让每次运行的结果都不一样,于是我重写了这个函数:
inline void shuffle(T first, T last)
{
const int _RBITS = 15;
const int _RMAX = (1U << _RBITS) - 1;
T temp = first;
srand((unsigned)time(NULL));
for (int i = 1; ++temp != last; ++i)
{
unsigned long _Rm = _RMAX;
unsigned long _Rn = rand() & _RMAX;
for (; _Rm < i && _Rm != ~0UL;_Rm = _Rm << _RBITS | _RMAX)
_Rn = _Rn << _RBITS | _RMAX;
iter_swap(temp, first + int(_Rn % i));
}
}
其实也没有改变什么,只是增加srand函数去改变随机种子并且去掉了对_Dist_type函数的调用而已。当我写到这里,突然间想到了是否可以不重写方法呢?只要在调用random_shuffle函数之前调用srand方法不就行了吗?试了一下,果然成功了。哇,太笨了。What a shame!
说实在的,我对那个_Pd还是有点云里雾里的,还恳请各位大侠指点一二了。
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1265重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1141对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1046在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1327所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1230在写完了此Vector非彼Vector这篇随笔 ... -
WebWork初体验
2004-08-11 17:43 1291在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1130昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1041昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1531由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1235今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1035为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1129昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 903使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1035这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1004今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 962在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1523昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1583很久没有用 ... -
两天四疑问
2004-09-03 10:56 9949月份的前两天,我仍然做着网站开发的工作。在开 ... -
MFC全接触(二)
2004-09-05 23:56 1292上一次和MFC邂逅,我和她谈得很投机。[1]分 ...
相关推荐
凑巧的是,我最近也刚买了一个iPod shuffle,因此先帮大家作了小白鼠。经过测试,该程序的确有用(并未在iTunes中启用移动存储功能, 也还没测试运行过rebuild_db.exe后是否还可以使用iTunes软件),原先用iTunes...
该章节涉及了iPod shuffle的概览和基本控制方法。iPod shuffle通过正面的控制按钮、VoiceOver功能以及三路开关来进行操作,用户可以通过这些控制在设备上播放歌曲、有声读物、音频Podcast和iTunesU精选。另外,本...
标题中的“ipod shuffle顺序调整工具”指的是一个专门设计用于改变第一代iPod Shuffle中歌曲播放顺序的应用程序。这个工具的出现是因为第一代iPod Shuffle没有屏幕,用户不能直接在设备上排列歌曲顺序,通常需要依赖...
在MATLAB中,`shuffle`函数用于将数组的元素进行随机排列,这在处理数据集时非常有用,比如在训练机器学习模型时进行数据集的打乱以避免过拟合。MATLAB的标准库中提供了`randperm`函数来生成一个包含指定范围内随机...
下面我会具体描述Shuffle的事实情况。 在Hadoop这样的集群环境中,大部分map task与reduce task的执行是在不同的节点上。当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map task结果。如果集群正在运行的...
### Spark Shuffle机制详解 #### 一、Spark Shuffle概念与作用 **Spark Shuffle**是指在Spark应用程序执行过程中,数据从一个节点或分区移动到另一个节点或分区的过程。这种数据重分布通常发生在诸如`groupByKey`,...
Hadoop Mapreduce过程shuffle过程全解析,Shuffle过程
spark.shuffle.compress true 是否对map side输出的文件进行压缩,默认是启用压缩的,压缩器是由spark.io.compression.codec属性指定的,默认是snappy压缩器,该压缩器强调的是压缩速度,而不是压缩率
《Shuffle Transformer:对视觉变换器空间洗牌的再思考》 近年来,基于窗口的变换器在非重叠局部窗口内计算自注意力,已经在图像分类、语义分割...这将有助于其他研究人员理解和利用该方法,推动视觉计算领域的发展。
此外,该软件还支持热键操作,用户可以通过自定义快捷键来实现图标位置的快速调整。 值得注意的是,"Taskbar Shuffle"是一款第三方软件,虽然它可以很好地与Windows系统集成,但使用任何非官方软件都可能存在一定的...
iPod shuffle是苹果公司推出的便携式数字音乐播放器,属于iPod系列,具有小巧轻便的特点,是苹果最小的mp3播放器。用户手册为用户提供了详细的使用说明,方便用户了解和掌握iPod shuffle的基本功能和操作方法。 在...
在c#中开发shuffle的代码。using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace ...
Hadoop Shuffle 过程详解 Hadoop 的 Shuffle 过程是 MapReduce 的核心,也被称为奇迹发生的地方。要想理解 MapReduce,Shuffle 是必须要了解的。Shuffle 的正常意思是洗牌或弄乱,可能大家更熟悉的是 Java API里的 ...
SparkShuffle思维导图,xmind
我们都知道,Shuffle 操作在 Spark 中是一种昂贵的操作。在 Facebook,单个 Job 的 Shuffle 就可能往磁盘中写入 300TB 的数据;而且 shuffle reads 也是一种低效的操作,这会大大延长作业的整体执行时间,并且消耗...
**标题详解:** "筛选插件Shuffle.js和响应式网格分类、排序" Shuffle.js是一款强大的JavaScript库,专门用于创建动态的、响应式的网格布局系统。它支持对元素进行筛选、排序和分组,使得网页上的内容可以更加灵活...
描述的是hadoop大数据任务运行的详细过程,输入和格式,shuffle
专用于破解ipod shuffle 2,让你的ipod shuffle 2摆脱个人电脑,摆脱ituns;将MP3歌曲存于根目录下(支持文件夹形式),本文件也置于根目录下,双击运行即可;破解有危险,出了问题自己承担