1

我是自己编程和学习 C++ 的新手。我设法编写了一个使用“Mersenne Twister”引擎的伪随机数生成器。

double gen_rand()
{
 std::mt19937 generator (time(0));
 std::uniform_real_distribution<double> dis(0.0, 1.0);

 return dis(generator);
}

当我从 内的循环调用此函数时main(),输出始终相同。我确定这是因为我在函数体中使用的种子,time(0). 因为我每次打电话时都提供相同的种子gen_rand(),所以我得到了相同的结果。

我可以找到解决此问题的一种方法是将函数体嵌入其中,main()而不是使用单独的函数。但由于我可能在其他地方需要随机数,所以外部函数对我更有用。我看到有些人创建了标题来实现类似的结果,但这样的解决方案远远超出了我目前的知识水平。

有没有办法在调用外部函数之前启动种子并让函数使用这个过程来生成随机数?

下面是我使用的循环:

#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;
 }
}
4

1 回答 1

2

我正在使用这个(与您的类似):

#include <random>
std::mt19937 rng(time(NULL));
int random(int n) {
  std::uniform_int_distribution<int> distribution(0, n);
  return distribution(rng);
}

如您在此处看到的:均匀随机数 ∈[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
于 2016-03-14T22:07:49.683 回答