我在兩個不同的環境(Linux和visual studio)中編譯了完全相同的代碼,生成亂數。但我注意到,輸出結果是不同的。我在網上搜索了一下,了解到這兩種實作產生的亂數不同。但是我需要在Linux上生成與visual studio生成的相同的亂數。
所以,如何讓兩個不同的環境(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();/span>
//for (size_t i = 0; i < len; i) {
// size_t swap_index = rand() % len;
mt19937引擎。
engine.seed(3)。
for (size_t i = 0; i < 5430; i) {
size_t swap_index = engine() % 5430;
if (i == swap_index)
繼續。
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(){
srand(3)。
mix_dataset(array_X_dataset, array_Y_dataset)。
uj5u.com熱心網友回復:
你可以使用Mersenne twister,它有可重復的輸出(它是標準化的)。 在兩臺機器上使用相同的種子,你就可以開始了。
#include <隨機>/span>
#include <iostream>
int main()
{
std::mt19937引擎。
engine.seed(1)。
for (std::size_t n = 0; n < 10; n)
{
std::cout << engine() << std::endl;
}
你可以在這里驗證,https://godbolt.org/z/j5r6ToGY7,只要選擇不同的編譯器并檢查輸出即可
。uj5u.com熱心網友回復:
如果你想要一個已知演算法的偽亂數,你必須用C library明確選擇它們。
你不能用rand()這樣做,因為不同的 C 庫實作方式會有所不同。
并且請區分偽亂數生成器(它將從相同的種子產生相同的序列)和亂數生成器,它們的重合可能性微乎其微。
uj5u.com熱心網友回復:
由于兩個平臺提供的標準庫函式實作不同,你需要決定一個PRNG,它在兩個平臺上給定相同種子的輸出是相同的。
當涉及到 rand 所暴露的 PRNG 的質量時,標準 C 所提供的保證非常少,嚴肅的應用程式應該遠離它。
無論批評意見如何,您使用PCG將處于更好的位置,例如,因為您似乎不需要密碼學質量。
。此外,避免
size_t swap_index = rand( ) % len。
因為隨機性可能會受到影響。如果你選擇的庫沒有提供替代方案,你可以使用拒絕采樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/326356.html
標籤:
