使用连续种子生成均匀随机数
Using continuously seed to generate uniform random numbers?
我有一个有趣的问题,即
通过使用标准库(或任何其他随机生成器)中著名的mersenne twister std::mt19937 r
,并将其设置为种子r.seed(4)
,例如,可以获得均匀随机生成的数(在uint_fast32_t
提供的范围内)。
如果我们从1循环到100并生成第一个随机数,究竟会发生什么,这个序列是否仍然均匀分布?
for(int i = 0;i<100;i++){
r.seed(i);
int v = r();
}
我有一些算法,通过使用这个技巧来实现,而不是以通常的方式生成数字(每次都不重置种子)。
我实际上不相信像这样误用生成器,序列的一致性可以继续保持。
有谁有专业知识能给出一些理由吗?
非常感谢!
这段代码按照您所说的,重置每个数字生成之间的种子:
#include <iostream>
#include <random>
int main ()
{
std::mt19937 r;
for(int i = 0;i<10;i++){
r.seed(i);
int v = r();
std::cout << v << std::endl;
}
return 0;
}
程序的输出是deterministic。在每次生成之间不断重置状态(此状态用于生成下一个随机数)。你绝对不能保证从不同的mersenne序列生成的数字的分布或均匀性(同样,每次重置种子时都会启动一个新序列)。
如果您的目标是生成一个受区间约束的均匀分布,请使用std::uniform_real_distribution
:
示例from en.cppreference.com:
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(1, 2);
for (int n = 0; n < 10; ++n) {
std::cout << dis(gen) << ' ';
}
std::cout << 'n';
}
在c++标准中定义,第§26.5.8.2.2节:
uniform_real_distribution随机数分布产生随机数字x, a≤x <B,按常数分布概率密度函数p>
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 整数不会重复超过随机数
- 模板元程序查找相似的连续类型名称
- if数组上的随机数
- EASTL矢量<向量<int>>连续的
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 当需要超过16GB的连续内存时,内存分配失败
- 我应该如何表示我拥有的连续元素序列?
- 半随机数生成C++
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 蛇在C++不会连续转两次
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 具有随机数的二维数组不会更改
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 随机数未达到限制
- 我想生成许多矩阵并用随机数填充它
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 使用连续种子生成均匀随机数
- 如何生成不会产生超过 X 个连续元素的随机数序列