我在兩個不同的環境(Linux和visual studio)中編譯了完全相同的代碼。但我注意到,輸出結果并不一樣。我嘗試用不同的方法來解決這個問題,但都失敗了。 我需要知道為什么?
是我錯過了什么還是什么?我希望輸出結果是相同的,以便繼續推進我的專案。誰能幫幫我呢?
我的代碼:
void mix_dataset(array<array< int, 20>, 5430> & array_X_dataset, array<int, 5430>& array_Y_dataset) {
size_t len = array_X_dataset.size()。
for (size_t i = 0; i < len; i) {
size_t swap_index = rand( ) % len;
if (i == swap_index)
continue;
array<int, 20> data_point{ };
data_point = array_X_dataset[i];
array_X_dataset[i] = array_X_dataset[swap_index];
array_X_dataset[swap_index] = data_point;
int Y = array_Y_dataset[i];
array_Y_dataset[i] = array_Y_dataset[swap_index];
array_Y_dataset[swap_index] = Y;
}
}
int main()
{
string filename = ".//dataset.csv"/span>;
static array<array<int, 20> , 5430> array_X_dataset{};
static array<int, 5430> array_Y_dataset{};
bool error = read_data_set(filename, array_X_dataset, array_Y_dataset);
if(錯誤) {
printf("Exiting with error while reading dataset file
")。)
exit(-1)。
}
srand(3)。
mix_dataset(array_X_dataset, array_Y_dataset)。
int* array_Y_set = new int[5430] 。
int** array_X_set = new int* [5430]。
for (int i =0; i < 5430; i ) {
array_X_set[i] = new int[20] 。
}
for (int i = 0; i < 5430; i ) {
for (int j =0; j < 20; j )
array_X_set[i][j] = array_X_dataset[i][j];
array_Y_set[i] = array_Y_dataset[i];
}
printf("printout the whole dataset after random mixing:
"); //輸出是不同的。
for (int i = 0; i < 5430; i ) {
printf(" %d ", i) 。
for (int j = 0; j < 20; j )
printf(" %d ", array_X_set[i][j]) 。
printf(" %d ", array_Y_set[i]) 。
printf("
")。)
}
uj5u.com熱心網友回復:
你正在使用rand()來隨機化輸出。rand()在不同的實作中可以使用不同的偽亂數發生器。因此,使用相同的種子(srand(3))不足以保證在編譯和運行Windows和Linux的代碼時獲得相同的結果。更多細節見這里。為什么C stdlib rand()函式在不同平臺上對同一種子給出不同的值?(感謝 phuclv 提供的鏈接)。
我對<random>不是很熟悉,也許它在這里可以提供幫助。不過,參考Mgetz的評論:
不幸的是,它被指定了,但沒有被指定得足夠好,以至于無法在不同的工具鏈或甚至不同的版本中進行復制。盡管如此,它仍然比rand()好得多。
如果是這樣的話,你可以使用一些代碼將一串亂數寫入一個檔案,然后從該檔案中讀取數字,而不是直接使用rand()。通過這種方式,你可以確保無論你在哪里運行代碼,都能使用相同的亂數序列。當然,你可能還是會看到不同的結果,但這樣你就知道原因不是rand(),而是在你的代碼中。首先你需要排除這個偏差的來源。
然而,參考 Pete Beckers 的評論:
生成器是完全指定的,并且需要在所有的實作上產生相同的序列。分布則不然。因此,如果你只是創建原始數字并管理你自己的分布(就像問題中的代碼使用
rand() % len那樣,<random>提供了完全正確的工具。
uj5u.com熱心網友回復:
你使用的IDE是不同的。 IDE的編譯器的作業方式可能不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/326357.html
標籤:
