использовать повышение вместо random_r / srandom_r? - PullRequest
0 голосов
/ 28 февраля 2011

Я пытаюсь сохранить отдельные случайные начальные числа для разных клиентов (из серверного приложения). random_r / srandom_r (linux api) нельзя использовать, потому что код должен компилироваться как в mac / linux.

Кажется, я мог бы использовать boost :: random вместо random_r / srandom_r.

Я попытался определить мою случайную функцию (которая является функцией-членом класса) и передать функцию третьему параметру random_shuffle.

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;
}

какова здесь правильная форма bind ()?

mRng.seed(mRandomSeed); //mRandomSeed will be different for different clients.
//I'm trying to random_shuffle a vector with the random seed.
random_shuffle(v.begin(), v.end(), boost::bind(&MyClass::_MyRandom, _1));

Будучи не слишком знакомым с boost :: random boost :: bind, я не уверен, сработает ли мой подход.
Любой комментарий о направлении будет также оценен.

1 Ответ

0 голосов
/ 28 февраля 2011

Есть некоторый код, который делает то, что вы хотите здесь . Этот предыдущий вопрос SO содержит более простой код, но вместо функционального объекта используется указатель на функцию, что не будет таким эффективным.Вот некоторый (не проверенный) код, который можно использовать в качестве последнего аргумента для random_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`)
...