c++ 我想在std::shuffle中使用我自己的随机函数,但它不起作用

3xiyfsfu  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(179)

当我使用myRand::RandInt而不是default_random_engine时,我得到了一个错误。但是我不明白我应该如何实现random_engine函数。我所做的工作在std::random_shuffle上运行良好,但是我知道这个函数已经被弃用,而std::shuffle是首选。
我在努力让这一切运转起来:

int main()
{
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    std::shuffle (v.begin(), v.end(), myRand::RandInt);
  
    return 0;
}

我定义了一个名称空间来实现这些函数:

namespace myRand {
    bool simulatingRandom = false;
    std::vector<int> secuenciaPseudoRandom = {1,0,1,0};
    long unsigned int index = 0;
    
    int Rand() {
        //check
        if (index > secuenciaPseudoRandom.size() - 1 ) {
            index = 0;
            std::cout << "Warning: myRand resetting secuence" << std::endl;
        };
        
        if (simulatingRandom) {
            //std::cout << "myRand returning " << secuenciaPseudoRandom[i] << std::endl;
            return secuenciaPseudoRandom[index++];
        }
        else {
            return rand();
        }
    }

    // works as rand() % i in the case of simulatingRandom == false
    int RandInt(int i) {

        return Rand() %i;
    }
}

基本上,我希望能够在模拟随机数和真随机数之间轻松切换,以便在我的主代码中,我可以将simulatingRandom设置为true,然后将其更改为false进行测试。也许有更好的方法来测试涉及随机数的函数。如果有,我愿意接受任何建议。

kmpatx3s

kmpatx3s1#

std::shuffle的最后一个参数必须满足UniformRandomBitGenerator的要求。生成器应该是一个对象,而不是函数。例如,最小实现为:

struct RandInt
{
    using result_type = int;

    static constexpr result_type min()
    {
        return 0;
    }

    static constexpr result_type max()
    {
        return RAND_MAX;
    }

    result_type operator()()
    {
        return Rand();
    }
};

然后,您可以将其称为:

std::shuffle (v.begin(), v.end(), myRand::RandInt());

请注意,如果您将simulatingRandom值设置为true以匹配预期值,则需要调整minmax的值。如果它们不匹配真实值,则std::shuffle可能不会像它应该的那样随机。
最后,必须提醒大家不要在现代代码中使用randWhy is the use of rand() considered bad?,尤其是在没有首先调用srand的情况下。使用rand是不推荐使用std::random_shuffle的主要原因。

相关问题