每次调用一个新的随机向量
A new random vector with each call
我想生成一个随机向量,其中包含 [min,max] 范围内的 n 个元素,它适用于梅森扭曲器和我下面的代码。
显然,每次调用 rand_vec
函数时,我都会得到相同的输出。但是我每次调用随机函数时都需要 return 不同的结果。此外,整个过程需要播种,每次执行的输出都必须相同。因此,在我的函数中使用 std::random_device
播种 twister 似乎不是一个选择。
另外,这个随机函数被我程序的几个子程序调用:
#include <iostream>
#include <vector>
#include <random>
std::vector<int> rand_vec(int n, int min, int max, std::mt19937 mt){
std::vector<int> to_return(n);
std::uniform_int_distribution<> my_dist(min, max);
for(int i = 0; i < n; i++){
to_return[i] = my_dist(mt);
}
return(to_return);
}
int main()
{
std::vector<int> to_print(5);
std::mt19937 mt;
mt = std::mt19937(100);
to_print = rand_vec(5, 0, 10, mt);
for(int i = 0; i < 5; i++){
std::cout << to_print[i] << " ";
}
std::cout << "\n\n";
to_print = rand_vec(5, 0, 10, mt);
for(int i = 0; i < 5; i++){
std::cout << to_print[i] << " ";
}
std::cout << "\n\n";
}
Compiled with /EHsc /nologo /W4 main.cpp
Compilation successful! Total compilation time: 359 ms
1 0 10 8 3
1 0 10 8 3
Total execution time: 562 ms
您需要通过引用传递随机数生成器
std::vector<int> rand_vec(int n, int min, int max, std::mt19937 mt)
应该是
std::vector<int> rand_vec(int n, int min, int max, std::mt19937 & mt)
否则,您将重复使用 main()
中相同的首字母 mt
,它将从相同的位置开始,为您提供相同的序列。
我想生成一个随机向量,其中包含 [min,max] 范围内的 n 个元素,它适用于梅森扭曲器和我下面的代码。
显然,每次调用 rand_vec
函数时,我都会得到相同的输出。但是我每次调用随机函数时都需要 return 不同的结果。此外,整个过程需要播种,每次执行的输出都必须相同。因此,在我的函数中使用 std::random_device
播种 twister 似乎不是一个选择。
另外,这个随机函数被我程序的几个子程序调用:
#include <iostream>
#include <vector>
#include <random>
std::vector<int> rand_vec(int n, int min, int max, std::mt19937 mt){
std::vector<int> to_return(n);
std::uniform_int_distribution<> my_dist(min, max);
for(int i = 0; i < n; i++){
to_return[i] = my_dist(mt);
}
return(to_return);
}
int main()
{
std::vector<int> to_print(5);
std::mt19937 mt;
mt = std::mt19937(100);
to_print = rand_vec(5, 0, 10, mt);
for(int i = 0; i < 5; i++){
std::cout << to_print[i] << " ";
}
std::cout << "\n\n";
to_print = rand_vec(5, 0, 10, mt);
for(int i = 0; i < 5; i++){
std::cout << to_print[i] << " ";
}
std::cout << "\n\n";
}
Compiled with /EHsc /nologo /W4 main.cpp
Compilation successful! Total compilation time: 359 ms
1 0 10 8 3
1 0 10 8 3
Total execution time: 562 ms
您需要通过引用传递随机数生成器
std::vector<int> rand_vec(int n, int min, int max, std::mt19937 mt)
应该是
std::vector<int> rand_vec(int n, int min, int max, std::mt19937 & mt)
否则,您将重复使用 main()
中相同的首字母 mt
,它将从相同的位置开始,为您提供相同的序列。