在STDDEF.H文件中,我也找到ptrdiff的定义:typedef int ptrdiff_t。那么这个函数到底做了什么呢?不就是返回了一个 int *吗?而且值为00000000。更要命的是,传递进去之后,也没有地方使用啊,整个函数就在for循环出出现了_Pd,那么在这样的一段代码中,_Pd起到了怎样的作用呢?我觉得一点用处都没有。接下来的代码,由于在运行的时候,都没有改变通过srand改变随机数种子的话,得到的_Rn是恒定的,所以每次运行的结果都一样就不难理解了。现在我是知道了为什么得到的随机序列是一样的了,可是这个函数为什么要设计成这样呢?我能想到的就是为了随机序列能够被追溯吧。 为了能够让每次运行的结果都不一样,于是我重写了这个函数:
template <typename T> inline void shuffle(T first, T last) { constint _RBITS =15; constint _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还是有点云里雾里的,还恳请各位大侠指点一二了。