C++ 在循环中调用 Pseudo-Random 数字生成器函数 - 常量种子问题
C++ Calling Pseudo-Random Number Generator Function within a Loop - Constant Seed Issue
我是编程和自学 C++ 的新手。我设法编写了一个使用 "Mersenne Twister" 引擎的 pseudo-random 数字生成器。
double gen_rand()
{
std::mt19937 generator (time(0));
std::uniform_real_distribution<double> dis(0.0, 1.0);
return dis(generator);
}
当我从 main()
中的循环调用此函数时,输出始终相同。我确定这是因为我在函数 body、time(0)
中使用的种子。因为我每次调用 gen_rand()
时都提供相同的种子,所以我得到相同的结果。
我找到的解决此问题的一种方法是将函数 body 嵌入到 main()
中,而不是使用单独的函数。但由于我可能在其他地方需要随机数,所以外部函数对我更有用。我看到有人创建了 headers 来实现类似的结果,但是这样的解决方案远远超出了我目前的知识水平。
有没有办法在调用外部函数之前启动种子并让该函数使用此过程生成随机数?
下面是我使用的循环:
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
int main()
{
std::vector<double> r_num;
for (int i = 0; i<leg; ++i)
{
r_num.push_back(gen_rand());
std::cout << r_num[i] << std::endl;
}
}
我正在使用这个(与你的相似):
#include <random>
std::mt19937 rng(time(NULL));
int random(int n) {
std::uniform_int_distribution<int> distribution(0, n);
return distribution(rng);
}
如您所见:Uniformly random numbers ∈[min, max]。
此外,正如 tobi303 提到的,您可以这样做:
#include <iostream>
#include <random>
std::mt19937 rng(time(NULL));
int n = 5;
std::uniform_int_distribution<int> distribution(0, n);
int main() {
std::cout << distribution(rng) << std::endl;
std::cout << distribution(rng) << std::endl;
std::cout << distribution(rng) << std::endl;
return 0;
}
多个输出:
gsamaras@gsamaras:~$ g++ -Wall -std=c++0x px.cpp
gsamaras@gsamaras:~$ ./a.out
3
1
0
gsamaras@gsamaras:~$ ./a.out
5
2
0
gsamaras@gsamaras:~$ ./a.out
5
2
1
gsamaras@gsamaras:~$ pico px.cpp
gsamaras@gsamaras:~$ g++ -Wall -std=c++0x px.cpp
gsamaras@gsamaras:~$ ./a.out
5
4
3
我是编程和自学 C++ 的新手。我设法编写了一个使用 "Mersenne Twister" 引擎的 pseudo-random 数字生成器。
double gen_rand()
{
std::mt19937 generator (time(0));
std::uniform_real_distribution<double> dis(0.0, 1.0);
return dis(generator);
}
当我从 main()
中的循环调用此函数时,输出始终相同。我确定这是因为我在函数 body、time(0)
中使用的种子。因为我每次调用 gen_rand()
时都提供相同的种子,所以我得到相同的结果。
我找到的解决此问题的一种方法是将函数 body 嵌入到 main()
中,而不是使用单独的函数。但由于我可能在其他地方需要随机数,所以外部函数对我更有用。我看到有人创建了 headers 来实现类似的结果,但是这样的解决方案远远超出了我目前的知识水平。
有没有办法在调用外部函数之前启动种子并让该函数使用此过程生成随机数?
下面是我使用的循环:
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
int main()
{
std::vector<double> r_num;
for (int i = 0; i<leg; ++i)
{
r_num.push_back(gen_rand());
std::cout << r_num[i] << std::endl;
}
}
我正在使用这个(与你的相似):
#include <random>
std::mt19937 rng(time(NULL));
int random(int n) {
std::uniform_int_distribution<int> distribution(0, n);
return distribution(rng);
}
如您所见:Uniformly random numbers ∈[min, max]。
此外,正如 tobi303 提到的,您可以这样做:
#include <iostream>
#include <random>
std::mt19937 rng(time(NULL));
int n = 5;
std::uniform_int_distribution<int> distribution(0, n);
int main() {
std::cout << distribution(rng) << std::endl;
std::cout << distribution(rng) << std::endl;
std::cout << distribution(rng) << std::endl;
return 0;
}
多个输出:
gsamaras@gsamaras:~$ g++ -Wall -std=c++0x px.cpp
gsamaras@gsamaras:~$ ./a.out
3
1
0
gsamaras@gsamaras:~$ ./a.out
5
2
0
gsamaras@gsamaras:~$ ./a.out
5
2
1
gsamaras@gsamaras:~$ pico px.cpp
gsamaras@gsamaras:~$ g++ -Wall -std=c++0x px.cpp
gsamaras@gsamaras:~$ ./a.out
5
4
3