相关疑难解决方法(0)

使用boost :: random作为std :: random_shuffle的RNG

我有一个程序使用boost :: random的mt19937随机数生成器.我需要做一个random_shuffle,并希望为此生成的随机数来自这个共享状态,这样它们就可以确定为mersenne twister之前生成的数字.

我试过这样的事情:

void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
    struct bar {
        boost::mt19937 &_state;
        unsigned operator()(unsigned i) {
            boost::uniform_int<> rng(0, i - 1);
            return rng(_state);
        }
        bar(boost::mt19937 &state) : _state(state) {}
    } rand(state);

    std::random_shuffle(vec.begin(), vec.end(), rand);
}
Run Code Online (Sandbox Code Playgroud)

但是我得到一个模板错误,用rand调用random_shuffle.但是这有效:

unsigned bar(unsigned i)
{
    boost::mt19937 no_state;
    boost::uniform_int<> rng(0, i - 1);
    return rng(no_state);
}
void foo(std::vector<unsigned> &vec, boost::mt19937 &state)
{
    std::random_shuffle(vec.begin(), vec.end(), bar);
}
Run Code Online (Sandbox Code Playgroud)

可能是因为它是一个实际的函数调用.但显然这并没有使国家不受最初的mersenne twister影响.是什么赋予了?有没有办法在没有全局变量的情况下做我想做的事情?

c++ stl boost-random

11
推荐指数
3
解决办法
6769
查看次数

即使srand(time(0))调用一次,std :: random_shuffle也会产生相同的结果

在函数中,我想生成范围内的数字列表:(在执行程序时,此函数仅被调用一次.)

void DataSet::finalize(double trainPercent, bool genValidData)
{
    srand(time(0));
    printf("%d\n", rand());

    // indices = {0, 1, 2, 3, 4, ..., m_train.size()-1}
    vector<size_t> indices(m_train.size());
    for (size_t i = 0; i < indices.size(); i++)
        indices[i] = i;

    random_shuffle(indices.begin(), indices.end());
// Output
    for (size_t i = 0; i < 10; i++)
        printf("%ld ", indices[i]);
    puts("");

}
Run Code Online (Sandbox Code Playgroud)

结果如下:

850577673
246 239 7 102 41 201 288 23 1 237 
Run Code Online (Sandbox Code Playgroud)

几秒钟后:

856981140
246 239 7 102 41 201 288 23 1 237 
Run Code Online (Sandbox Code Playgroud)

和更多:

857552578
246 239 …
Run Code Online (Sandbox Code Playgroud)

c++ random vector srand

6
推荐指数
1
解决办法
1263
查看次数

在C++中的随机向量

我有一个std :: vector,我需要随机播放.它只有大约20名成员.每次运行程序时,它还需要产生不同的shuffle.

现在我正在使用random_shuffle,但是每次运行程序时它都会给出相同的结果.我试过srand(unsigned(time(NULL)));在这个帖子中提出的,但是,这在我的平台上不起作用.

如果可能,我想只使用标准代码.

编辑:这是我的实现:

vector<Tile>gameTiles;
gameTiles.push_back(Tile(0,0));
gameTiles.push_back(Tile(0,1));
gameTiles.push_back(Tile(0,2));
gameTiles.push_back(Tile(0,3));
gameTiles.push_back(Tile(0,4));
//etc. ~20 member

random_shuffle(gameTiles.begin(), gameTiles.end());
Run Code Online (Sandbox Code Playgroud)

c++ shuffle vector

4
推荐指数
1
解决办法
2502
查看次数

在C ++中获取随机唯一整数

我要带一个格式化的文本文件,并将不同的行放在随机位置的数组中。但是,当我尝试获取时rand() % 8,我会获得以前的值。这使我丢失了一些行,并使数组的某些部分留空。

我应该如何修改它,以便以随机顺序获得从0到7的唯一值?我只使用我在课堂上学到的东西,导师不推荐新东西。请帮助我更改此代码的逻辑。

void get_input(string (&teams)[8][6]) {
    srand(time(NULL));
    string filename;
    double value;
    char buffer[100];
    int diffnum[8];
    string token;
    cout << "Enter the input file: ";
    cin >> filename;
    ifstream infile;
    infile.open (filename.c_str());
    if (infile.is_open()) {
    int teamcounter = 0;
        while (infile.getline (buffer, 100) && teamcounter < 8) {
            int ran = rand()%8;
            for (int find = 0; find < 8; find++) {
                while (diffnum[find] == ran) {
                    ran = rand()%8;
                }
            }
            diffnum[teamcounter] = ran;
            int counter …
Run Code Online (Sandbox Code Playgroud)

c++ random

2
推荐指数
2
解决办法
1141
查看次数

向量的随机访问

我有一个 C++ 向量,它已排序数据,我想以随机顺序访问数据以对数据进行洗牌。rand 的问题是可以同时访问两个索引,并且当最后一项保留时,将会有很多不需要的查找。有什么建议。

c++ random vector

2
推荐指数
1
解决办法
4096
查看次数

在确定的时间内生成某些数字的随机序列

我编写了以下代码来生成某些数字{0,1,2,...,31}的随机序列.它工作正常,但不能保证在任何有限的时间内完成; 在任何间隔之后,仍然只有一定(非常高)的概率将完成.有关删除此问题的任何建议吗?

int th;
vector<int> V2 = vector<int> (32,0);
for (int k=0;k<32;k++){

    do{
        th = rand() % 32;
    } while ( V2[th] == 0 );

    V2[th] = k;
}
Run Code Online (Sandbox Code Playgroud)

c++ random

1
推荐指数
1
解决办法
140
查看次数

生成小范围的不同随机数?

我正在尝试生成一小段(约20个)不同/唯一的随机数.

这就是我现在拥有的:

unique_random.h:

#ifndef UNIQUE_RANDOM_H
#define UNIQUE_RANDOM_H

// generates a pseudo-random number in [min, max]
int random_number (unsigned int min, unsigned int max) {
    static bool seed_initialized = false;

    if (!seed_initialized) {
        seed_initialized = true;
        srand((unsigned int) time(NULL));
    }

    return rand() % (max - min + 1) + min; 
} 

// generates a random number different from the previously generated
int random_number_without_these (int min, int max, std::set<int>& generated) {
    int res = random_number (min, max);

    // if res one …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm

1
推荐指数
1
解决办法
494
查看次数

标签 统计

c++ ×7

random ×4

vector ×3

algorithm ×1

boost-random ×1

shuffle ×1

srand ×1

stl ×1