处理(否则)包含C++ 11随机类的随机生成器调用的常量函数的正确方法是什么?您是否应该放弃函数的常量标志,还是将生成器和分布声明为类的可变元素?一个最小的例子(不编译)可能是:
#include <random>
class foo
{
std::mt19937 MyGenerator;
std::normal_distribution<precision_type> gauss;
double get_rnd() const {return gauss(MyGenerator);}
};
Run Code Online (Sandbox Code Playgroud) 以下代码似乎没有直观的行为:
#include <random>
#include <iostream>
using namespace std;
int main()
{
mt19937 MyGenerator(40);
auto gauss = normal_distribution<double>(0,1);
auto linear = uniform_real_distribution<double>(0,1);
cout << gauss(MyGenerator) << endl; //line a
cout << linear(MyGenerator) << endl; //line b
cout << gauss(MyGenerator) << endl;
}
Run Code Online (Sandbox Code Playgroud)
运行此代码可提供输出
-0.816097
0.705030
0.303032.
Run Code Online (Sandbox Code Playgroud)
如果现在交换行a和b的顺序,则输出变为
0.644008
0.338080
-0.639501.
Run Code Online (Sandbox Code Playgroud)
很明显,前两个数字现在是不同的,因为它们是由不同的分布产生的.不过,为什么第三个数字不同?在我的直觉中,分布应该获取一个数字c = MyGenerator(),然后将其映射到特定范围内的随机数.随机数生成器将指向分发调用之后的数字序列中的下一个数字.那么,在这两种情况下,第三次调用的结果不应该相同吗?
另一个观察结果:对其中一个发行版添加第四个调用实际上似乎会重现相同的数字.
不知何故,为圆圈指定颜色与散点图中的颜色分配不同:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(6,6)) # give plots a rectangular frame
N = 4
r = 0.1
pos = 2.*np.random.rand(N,2) -1
# give different points different color
col = 1./N*np.arange(0,N)
# Method 1
for i,j,k in zip(pos[:,0],pos[:,1],col):
circle = plt.Circle((i,j), r, color = k)
fig.gca().add_artist(circle)
plt.show()
# Method 2
plt.scatter(pos[:,0],pos[:,1], c = col)
plt.show()
Run Code Online (Sandbox Code Playgroud)
为什么方法2工作,而方法1给出以下错误:
ValueError: to_rgba: Invalid rgba arg "0.0"
to_rgb: Invalid rgb arg "0.0"
cannot convert argument to rgb sequence
Run Code Online (Sandbox Code Playgroud)