繁体   English   中英

C ++ random_shuffle产生相同的结果

[英]C++ random_shuffle produces same result

我正在测试random_shuffle函数模板,并且能够在MacBook上生成不同的输出。 但是,当我在朋友的Windows计算机上尝试时,情况有所不同。

该程序将尝试生成5 int并随机交换它们。 后来将其转换为char用于其他用途,这并不是很重要。

randPerm()函数将初始化vector并执行交换,然后以数组形式返回。 由于上面定义的POPULATION_SIZE常数,此函数将被调用2次。 稍后, chromosome 2D阵列将填充相应的字符。

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <cstdlib>
using namespace std;

// constant
const int NUM_OF_GENE = 5;
const int POPULATION_SIZE = 2;
const char CITIES[NUM_OF_GENE] = { 'A', 'B', 'C', 'D', 'E' };

// chromosome structure
char chromosome[POPULATION_SIZE][NUM_OF_GENE];

// function prototypes
int generateSeed(int i);
int * randPerm();
void initializeChromosome();
void printChromosome();


int main(int argc, const char * argv[]) {
    initializeChromosome();
    printChromosome();
    return 0;
}

// seed generator
int generateSeed(int i) {
    return rand() % i;
}

// return a randomly permutated array
int * randPerm() {
    static int arr[NUM_OF_GENE];

    // give some randomness
    srand ( unsigned ( time(0) ) );
    vector<int> myVector;

    for (int i=0; i<NUM_OF_GENE; i++) {
        myVector.push_back(i);
    }

    random_shuffle(myVector.begin(), myVector.end());
    random_shuffle(myVector.begin(), myVector.end(), generateSeed);
    copy(myVector.begin(), myVector.end(), arr);

    return arr;
}

void initializeChromosome() {
    for (int i=0; i<POPULATION_SIZE; i++) {
        int * randArr = randPerm();

        // allocate cities (in char) into the chromosome array
        for (int j=0; j<NUM_OF_GENE; j++) {
            chromosome[i][j] = CITIES[randArr[j]];
        }
    }
}

void printChromosome() {
    for (int i=0; i<POPULATION_SIZE; i++) {
        for (int j=0; j<NUM_OF_GENE; j++) {
            cout << chromosome[i][j] << " ";
        }
        cout << "\n";
    }
}

我的Mac上的结果每次都会得到不同的结果 在此处输入图片说明

Windows机器上的结果

甚至使用CodeBlocks,Visual Studio 2017甚至在线c ++编译器进行了测试。 还测试了不同的GCC版本。 我的Mac使用的是GCC 4.2.1

B A D E C 
B A D E C 

HansPassant的建议很有帮助。 通过从循环中删除srand()函数,我可以再次实现随机性。

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <cstdlib>
using namespace std;

// constant
const int NUM_OF_GENE = 5;
const int POPULATION_SIZE = 2;
const char CITIES[NUM_OF_GENE] = { 'A', 'B', 'C', 'D', 'E' };
//const int CITIES[NUM_OF_GENE] = {0, 1, 2, 3, 4};

// chromosome structure
char chromosome[POPULATION_SIZE][NUM_OF_GENE];

// function prototypes
int generateSeed(int i);
int * randPerm();
void initializeChromosome();
void printChromosome();


int main(int argc, const char * argv[]) {

    srand ( unsigned ( time(0) ) );

    initializeChromosome();
    printChromosome();
    return 0;
}

int generateSeed(int i) {
    return rand() % i;
}

// return a randomly permutated array
int * randPerm() {
    static int arr[NUM_OF_GENE];

    vector<int> myVector;

    for (int i=0; i<NUM_OF_GENE; i++) {
        myVector.push_back(i);
    }

    random_shuffle(myVector.begin(), myVector.end());
    random_shuffle(myVector.begin(), myVector.end(), generateSeed);
    copy(myVector.begin(), myVector.end(), arr);

    return arr;
}

void initializeChromosome() {
    for (int i=0; i<POPULATION_SIZE; i++) {
        int * randArr = randPerm();

        // allocate cities (in char) into the chromosome array
        for (int j=0; j<NUM_OF_GENE; j++) {
            chromosome[i][j] = CITIES[randArr[j]];
        }
    }
}

void printChromosome() {
    for (int i=0; i<POPULATION_SIZE; i++) {
        for (int j=0; j<NUM_OF_GENE; j++) {
            cout << chromosome[i][j] << " ";
        }
        cout << "\n";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM