lundi 11 juillet 2016

How to generate class dependent uniformly distributed random numbers?

I want to generate a list of class dependent random numbers, which means that even if we interrupt the process of generating random numbers with some rand() the generated list of random variables won't change as shown below.

#include <iostream>
#include <vector>

using namespace std;

class rand_generator_t {
public:
    rand_generator_t(int seed) : _seed(seed) {}
    int generate_one() {
        srand(_seed);
        int one_rand_num = rand();
        _seed = one_rand_num;
        return one_rand_num;
    }

private:
    int _seed;
};

int main() {
    vector<int> nums(15);

    rand_generator_t rand_num(1);

    for (int i = 0; i < 7; ++i) {
        nums[i] = rand_num.generate_one();
    }

    //rand(); <------ "rand_num" is class dependent because even if we add a "rand()" here, the output of "nums" does not change

    for (int i = 7; i < 15; ++i) {
        nums[i] = rand_num.generate_one();
    }

    for (int i : nums) {
        cout << i << endl;
    }
    cout << "================================================" << endl;

    srand(1);
    for (int i = 0; i < 15; ++i) {
        cout << rand() << " " << endl;
    }

    return 0;
}

I have the following confusions:

  1. I use the previous generated random number as the seed of the current random variable. However, the result is different from just using a list of rand(). I want to know if my version is uniformly distributed.

  2. How to improve my version of generating the class dependent random numbers.

  3. I prefer using rand(), please don't suggest me using something like std::mt19937_64, since my compiler does not support that.

Thanks a lot in advance.




Aucun commentaire:

Enregistrer un commentaire