C ++ STL std :: random_shuffle无法传递自定义随机数生成器

时间:2015-09-18 17:43:08

标签: c++ random stl

我想random_shuffle一个向量(我知道random_shuffle已被折旧),但是当我传递我从另一个线程复制的自定义随机函数时,我收到编译错误。有人可以告诉我如何使用下面发布的随机数生成器调用random_shuffle吗?

random_shuffle(defects.begin(), defects.end(), xorshf96);

static unsigned int x=123456789, y=362436069, z=521288629;

unsigned int xorshf96(void) {          //period 2^96-1
    unsigned int t;
    x ^= x << 16;
    x ^= x >> 5;
    x ^= x << 1;

    t = x;
    x = y;
    y = z;
    z = t ^ x ^ y;

    return z;
}

1 个答案:

答案 0 :(得分:0)

xorshf96不符合std::random_shuffle RandomFunc参数的要求:

  

r - 如果调用std::iterator_traits<RandomIt>::difference_type

,函数对象会在[0,n)区间内将随机选择的可转换类型值返回到r(n)

它必须接受一个参数并返回一个小于它的随机数。该函数是Knuth Shuffle的实现,这就是该算法的工作方式。

作为示例修复,您可以提供:

unsigned int xorshf96_fixed(int n)
{
    return xorshf96() % n;
}

random_shuffle(defects.begin(), defects.end(), xorshf96_fixed);