我正在使用随机数对物理模拟进行大量编码,我只是第一次对我的代码进行了描述,因此我可能在读取输出时出错,但我看到这条线首先出现:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
90.09 21.88 21.88 265536 0.08 0.08 std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul>::operator()()
Run Code Online (Sandbox Code Playgroud)
这似乎意味着生成数字生成器占用了90%的时间.我之前已经写过一篇文章,询问是否在每个循环中构建随机概率分布可以节省我的时间,但是在尝试和计时后它没有帮助(定义概率分布是否代价高昂?).是否有优化随机数生成的常用选项?
提前谢谢,我的模拟(在当前状态下)运行了几天,因此减少90%的计算时间将是一个重大进步.
我一直在研究需要生成大量随机数的物理模拟(如果你想要一个想法,至少10 ^ 13).我一直在使用Mersenne twister的C++ 11实现.我还读到,同一算法的GPU实现现在是Cuda库的一部分,并且GPU在此任务中可以非常高效; 但我找不到明确的数字或基准比较.例如,与8核i7相比,上一代的Nvidia卡在生成随机数方面更具性能吗?如果是,价格范围是多少?
我认为我的模拟可以从GPU产生大量随机数并且CPU完成其余工作中获益.
我正在看六角形2d格子上的物理问题.它现在是一个几何问题,只有格子边缘的一个子集是有意义的,我给出了这个集合.然后我应该将自己限制在可以用这些边缘组成的闭合曲线上.从这些多边形中,我想提取诸如直径(两个点之间的最大距离))和它们的分形维数之类的信息.
我仍然没有看到如何从原始的初始数据(无序的边缘数组),所以我想知道是否有包/库可以帮助我.从绘制这些边缘中的每一个边缘,它们可以返回它们形成的闭合环,然后分别分析这些多边形中的每一个.
谢谢.
我正在尝试以对数比例在直方图中绘制输入数据(以快速查看这是否符合幂律),但我在以我想要的方式输出时遇到了麻烦。我正在使用 Python,更具体地说是 matplotlib/numpy 库:
thebins = N.linspace(min_data.min(),min_data.max(),int(sys.argv[len(sys.argv)-1]))
thebins = N.log(thebins)
bar_min = plt.hist(min_data,bins=thebins,alpha=0.40,label=['Minimal Distance'],log=True)
Run Code Online (Sandbox Code Playgroud)
min_data 是我的一维数据数组,前两行用于创建 bin,然后将它们放入对数刻度中。最后一行用于用 log y 刻度“填充”箱/直方图。
图形输出为:

这可能看起来很挑剔,但我对不同厚度的箱子不满意,在我看来,数据更难读取,甚至可能被误读。并非所有对数直方图都具有相同宽度的 bin,我相信它可以在 Python 中完成;你有想法改变我的代码来到达那里吗?
先感谢您 ;)
应该很简单:我只需要获取 x 轴数据的对数,然后通过 y 轴参数“log=True”构建直方图。
我正在编写一个物理模拟编码,现在我觉得需要优化它.我正在考虑改进一点:我的一个方法之一(在几种情况下我称之为十亿次)每次定义一个概率分布.这是代码:
void myClass::myMethod(){ //called billions of times in several cases
uniform_real_distribution<> probd(0,1);
uniform_int_distribution<> probh(1,h-2);
uniform_int_distribution<> probv(1,v-2);
//rest of the code
}
Run Code Online (Sandbox Code Playgroud)
我可以将分发作为类的成员传递,这样我就不必每次都定义它们吗?只需在构造函数中初始化它们,并在h和v更改时重新定义它们?这可能是一个很好的优化进展吗?最后一个问题,当使用标志-O3或-O2编译时,编译器(在我的情况下是g ++)是否已经纠正了这个问题?
先感谢您!
更新:我对它进行了编码并对两者进行了计时:程序实际上变得有点慢(几个百分点)所以我回到了我的开始:在每个循环中创建概率分布
我发现了一些与QtCreator 一起玩的东西以及我在使用gcc的析构函数中遇到的错误:默认情况下,指针不等于NULL; 这需要手动添加(在我的情况下为构造函数).这是正确的吗?怎么会?它们的默认值是多少?
c++ ×5
optimization ×3
random ×2
2d ×1
c++11 ×1
cuda ×1
geometry ×1
hardware ×1
matplotlib ×1
plot ×1
probability ×1
python ×1
qt ×1