使用boost而不是random\r/srandom\r?

使用boost而不是random\r/srandom\r?,boost,random,bind,Boost,Random,Bind,我试图为不同的客户端(从服务器应用程序)维护单独的随机种子。 不能使用random\r/srandom\r(linux api),因为代码必须在mac/linux上编译 看起来我可以用boost::random代替random\r/srandom\r 我试图定义我的随机函数(类成员函数),并将该函数提供给random_shuffle的第3个参数 random_shuffle( RandomAccessIterator first, RandomAccessIterator last,

我试图为不同的客户端(从服务器应用程序)维护单独的随机种子。 不能使用random\r/srandom\r(linux api),因为代码必须在mac/linux上编译

看起来我可以用boost::random代替random\r/srandom\r

我试图定义我的随机函数(类成员函数),并将该函数提供给random_shuffle的第3个参数

random_shuffle( RandomAccessIterator first, RandomAccessIterator last,
                        RandomNumberGenerator& rand );


ptrdiff_t MyClass::_MyRandom(ptrdiff_t i)
{
    int result;

    boost::uniform_int<> numberInterval( 1, 10000);
    boost::variate_generator< RNGType, boost::uniform_int<> >
        dice(mRng, numberInterval); // mRng is boost::mt19937 type instance variable

    result = dice();
    //  random_r(mRandomData, &result);                                                                                                                                                                                                                                       
    result = result % i;

    return result;
}
由于不太熟悉boost::random boost::bind,我不太确定我的方法是否有效。

如对方向有任何意见,我们将不胜感激

有些代码可以满足您的需要。 具有更简单的代码,但使用函数指针而不是函数对象,这将没有那么有效。以下是一些(未经测试)代码,可作为
random\u shuffle
的最后一个参数:

template <typename Gen>
struct shuffle_wrapper {
  Gen& gen;
  shuffle_wrapper(Gen& gen): gen(gen) {}
  int operator()(int r) const {return boost::uniform_int<>()(gen, r);}
};

shuffle_wrapper<`your generator type`>(`your generator`)
模板
结构洗牌包装器{
Gen&Gen;
洗牌包装器(Gen&Gen):Gen(Gen){}
int运算符()(int r)常量{return boost::uniform_int()(gen,r);}
};
洗牌包装器(`your generator`)

我已经成功地使用了第一个链接中给出的代码(具有随机类)。有一个小问题是,我要到后来才知道向量的大小,我想把Random作为成员变量。我定义了默认的Random()构造函数,后来将其重新分配为mRandomInstance=Random(vector.size());另外,我还有在类中复制mRandomInstance=rhs.mRandomInstance的代码,该类将mRandomInstance作为变量。这两种做法都可以吗?@Eugene:请注意,我发布的代码在任何地方都没有使用向量大小。随机数的范围是由随机随机随机洗牌选择的,并且可能在算法过程中发生变化(洗牌的典型算法就是这样做的)。哦,我想,随机rnd中的10(10)是向量的大小。不必是?,实际上我的构造函数采用(N,randomSeed),即使我不需要将向量大小传递给构造函数,上面的问题仍然存在。重新分配、复制随机类可以吗?@Eugene:哦,你看到的是另一种代码变体,而不是
boost::bind
版本。那么,这个代码可能是错的。你能试试我贴的那个,看看对你是否有用吗?@Eugene:我很想看看它对你是否有用,因为人们会认为这是公认的答案。
template <typename Gen>
struct shuffle_wrapper {
  Gen& gen;
  shuffle_wrapper(Gen& gen): gen(gen) {}
  int operator()(int r) const {return boost::uniform_int<>()(gen, r);}
};

shuffle_wrapper<`your generator type`>(`your generator`)