如何将均匀分布(大多数随机数生成器产生,例如介于0.0和1.0之间)转换为正态分布?如果我想要选择的平均值和标准偏差怎么办?
我想生成一个范围(n到m,例如100到150)的随机数,但是我希望结果不是纯随机的,而是基于正态分布.
我的意思是,通常我希望数字"聚集"在125左右.
我发现这个随机数字包似乎有很多我需要的东西:http://codeproject.com/KB/recipes/Random.aspx
它支持各种随机生成器(包括mersiene twister),并可以将生成器应用于分发.
但我很困惑,如果我使用正态分布生成器,随机数从大约-6到+8(显然真正的范围是float.min到float.max).
如何扩展到我要求的范围?
我想知道在C++标准库中是否有任何高斯分布数生成器,或者是否有任何代码片段可以通过.
提前致谢.
首先,这是pdf高斯函数的正确C++表示吗?
float pdf_gaussian = ( 1 / ( s * sqrt(2*M_PI) ) ) * exp( -0.5 * pow( (x-m)/s, 2.0 ) );
Run Code Online (Sandbox Code Playgroud)
第二,我们做这样的事情是否有意义?
if(pdf_gaussian < uniform_random())
do something
else
do other thing
Run Code Online (Sandbox Code Playgroud)
编辑:你想要实现的目标的一个例子:
假设我有一个名为Y1的数据.然后一个名为Xi的新数据到达.我想知道是否应该将Xi与Y1相关联,或者我是否应该将Xi保留为将被称为Y2的新数据数据.这基于新数据Xi与现有数据Y1之间的距离.如果Xi与Y1"相距",那么Xi将不与Y1相关联,否则如果它"不远",则它将与Y1相关联.现在我想使用基于Y和过去已经与Y关联的数据之间的距离的平均值和偏差的高斯概率来模拟这个"远"或"不远".
我想(随机)生成数字,使数字遵循给定均值和方差的正态分布。我怎样才能实现这个目标?
如果能在Java的上下文中给出这个就更好了。人们可能会在这些答案中寻求帮助:但它们并不精确。 在 C/C++ 中生成遵循正态分布的随机数
我正在实现一些我希望尽可能便携的C++代码.我想避免依赖需要root访问权限的库来安装.此外,我更愿意避免在我的存储库中保留大型库的副本,而且我也不希望不对用户级别的库进行安装(仅仅因为我必须在多台计算机上手动安装它们.)
我想normal_distribution在我的项目中使用Boost 的功能.我知道安装Boost的典型方法需要一个sudo apt-get或一个sudo yum类型的命令,但我没有在运行此代码的系统上具有root访问权限.为了解决这个问题,我想知道是否可以在我的代码目录中放置Boost的normal_distribution.cpp和normal_distribution.hpp的副本,并使用这些文件编译/链接我的代码.这会有用吗?
读者可能想知道为什么我不只是normal_distribution在TR1或C++ 11中使用该实现.答案是我需要保持与仍然运行g ++ 4.1.x的大学管理集群的兼容性,这至少在我的经验中是不支持的<TR1/random>.
可能重复:
将均匀分布转换为正态分布
你好.
我想知道在C中实现的任何算法,它可以取0到1之间的随机值,平均值和标准差,然后返回正态分布的结果.
我现在没有足够的脑力来为自己解决这个问题.
我在互联网上找不到任何有用的东西.
谢谢.
我在堆栈溢出中搜索了该函数的一些描述、解释和片段std::normal_distribution<> variable(mean, stddev),并发现了一个特别的实例(如下所列),它对我的目的非常有效,即能够创建和容纳一个随机数根据给定均值和标准差的正态分布。
#include <random>
...
std::mt19937 generator;
double mean = 100.0, stddev = 15.0, example;
std::normal_distribution<double> normal(mean, stddev);
example = normal(generator);
cout << "Normal: " << example << endl;
Run Code Online (Sandbox Code Playgroud)
信用 - /sf/answers/838458561/。
然而,我遇到的一个问题是,随着时间的推移,这段代码的结果变得相当重复和可预测。例如,我反复使用平均值 100 和标准差 15,当运行超过 1000 时,几乎可以肯定的是,至少在我的系统上,一致地生成大约 52.246 和 156.86 的一个实例。
有没有办法操纵这个代码片段,或者如果我理解正确的话,种子,以便它产生每次都足够不同的各种结果,同时仍然遵守正态分布?
由于我对这个函数还是新手,我尝试用std::default_random_engine generator;代替std::mt19937 generator,虽然它产生了不同的结果,但随着时间的推移,它也有类似的重复问题。
from random import *
def main():
t = 0
for i in range(1000): # thousand
t += random()
print(t/1000)
main()
Run Code Online (Sandbox Code Playgroud)
我正在查看我教授给我的示例程序的源代码,我遇到了这个RNG.谁能解释这个RNG的工作原理?
random ×6
c++ ×4
gaussian ×4
algorithm ×3
boost ×1
c ×1
c++11 ×1
distribution ×1
for-loop ×1
installation ×1
java ×1
operators ×1
portability ×1
probability ×1
python ×1
python-3.x ×1
statistics ×1