C++ C++;随机洗牌产生相同的结果

C++ C++;随机洗牌产生相同的结果,c++,C++,我正在测试random_shuffle函数模板,能够在我的MacBook上生成不同的输出。然而,当我在朋友的Windows机器上试用时,情况就不同了 程序将尝试生成5个int并随机交换它们。后来,它被转换为char,用于其他用途,这并不重要 函数将初始化向量并执行交换,然后作为数组返回。由于上面定义的总体大小常量,此函数将被调用2次。稍后,染色体2D数组将填充相应的字符 #include <iostream> #include <algorithm> #include &

我正在测试random_shuffle函数模板,能够在我的MacBook上生成不同的输出。然而,当我在朋友的Windows机器上试用时,情况就不同了

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

函数将初始化向量并执行交换,然后作为数组返回。由于上面定义的总体大小常量,此函数将被调用2次。稍后,
染色体
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";
    }
}

汉帕桑的建议很有帮助。通过从循环中删除
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";
    }
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
//不变的
_基因的const int NUM_=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};
//染色体结构
char染色体[群体大小][基因数量];
//功能原型
int generateSeed(int i);
int*randPerm();
void initializeChromosome();
无效染色体();
int main(int argc,const char*argv[]{
srand(未签名(时间(0));
初始化染色体();
打印染色体();
返回0;
}
生成整数(整数i){
返回rand()%i;
}
//返回一个随机排列的数组
int*randPerm(){
静态int-arr[NUM_OF_基因];
向量myVector;

对于(int i=0;iHansPassant的建议很有帮助。通过从循环中删除
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";
    }
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
//不变的
_基因的const int NUM_=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};
//染色体结构
char染色体[群体大小][基因数量];
//功能原型
int generateSeed(int i);
int*randPerm();
void initializeChromosome();
无效染色体();
int main(int argc,const char*argv[]{
srand(未签名(时间(0));
初始化染色体();
打印染色体();
返回0;
}
生成整数(整数i){
返回rand()%i;
}
//返回一个随机排列的数组
int*randPerm(){
静态int-arr[NUM_OF_基因];
向量myVector;

对于(int i=0;i您读过了吗?(在C++14中不推荐)(在C++17中删除)。原因很好。这可以归结为“为什么rand()返回相同的值”,不是吗?或者它返回不同的数字,但您的代码出错了吗?只使用srand()一次,这样您就不会生成完全相同的种子。time()不会无限快地递增。@HansPassant您的建议很有帮助!您读过吗?(C++14中不推荐)(C++17中删除)。原因很充分。这归结为“为什么rand()返回相同的值”,不是吗?或者它返回不同的数,但您的代码出错了吗?使用srand()只有一次,这样您就不会生成完全相同的种子。时间()不会无限快地递增。@HansPassant您的建议很有帮助!