gpt4 book ai didi

C++ random_shuffle 产生相同的结果

转载 作者:行者123 更新时间:2023-11-28 01:36:17 25 4
gpt4 key购买 nike

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

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

randPerm() 函数将初始化一个vector 并执行交换,然后作为数组返回。由于上面定义的 POPULATION_SIZE 常量,该函数将被调用 2 次。稍后,chromosome 二维数组将填充相应的字符。

#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 上的结果 每次都得到不同的结果 enter image description here

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";
}
}

关于C++ random_shuffle 产生相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com