精华内容
下载资源
问答
  • 若已有[0,1]区间均匀分布随机数R,则产生X反变换公式为: F(x)=r, 即x=F-1(r) 反函数存在条件:如果函数y=f(x)是定义域D上单调函数,那么f(x)一定有反函数存在,且反函数一定是单调。分布函数F(x)为是一个单调...
  • 若已有[0,1]区间均匀分布随机数R,则产生X反变换公式为: F(x)=r, 即x=F-1(r) 反函数存在条件:如果函数y=f(x)是定义域D上单调函数,那么f(x)一定有反函数存在,且反函数一定是单调。分布函数F(x)为是一个单调...

    1.反变换法

    设需产生分布函数为F(x)的连续随机数X。若已有[0,1]区间均匀分布随机数R,则产生X的反变换公式为:

    F(x)=r, 即x=F-1(r)

    反函数存在条件:如果函数y=f(x)是定义域D上的单调函数,那么f(x)一定有反函数存在,且反函数一定是单调的。分布函数F(x)为是一个单调递增函数,所以其反函数存在。从直观意义上理解,因为r一一对应着x,而在[0,1]均匀分布随机数R≤r的概率P(R≤r)=r 因此,连续随机数X≤x的概率P(X≤x)=P(R≤r)=r=F(x)

    即X的分布函数为F(x)。

    例子:下面的代码使用反变换法在区间[0, 6]上生成随机数,其概率密度近似为P(x)=e-x  

     1 import numpy as np
     2 import matplotlib.pyplot as plt
     3 
     4 # probability distribution we're trying to calculate
     5 p = lambda x: np.exp(-x)
     6 
     7 # CDF of p
     8 CDF = lambda x: 1-np.exp(-x)
     9 
    10 # invert the CDF
    11 invCDF = lambda x: -np.log(1-x)
    12 
    13 # domain limits
    14 xmin = 0 # the lower limit of our domain
    15 xmax = 6 # the upper limit of our domain
    16 
    17 # range limits
    18 rmin = CDF(xmin)
    19 rmax = CDF(xmax)
    20 
    21 N = 10000 # the total of samples we wish to generate
    22 
    23 # generate uniform samples in our range then invert the CDF
    24 # to get samples of our target distribution
    25 R = np.random.uniform(rmin, rmax, N)
    26 X = invCDF(R)
    27 
    28 # get the histogram info
    29 hinfo = np.histogram(X,100)
    30 
    31 # plot the histogram
    32 plt.hist(X,bins=100, label=u'Samples');
    33 
    34 # plot our (normalized) function
    35 xvals=np.linspace(xmin, xmax, 1000)
    36 plt.plot(xvals, hinfo[0][0]*p(xvals), 'r', label=u'p(x)')
    37 
    38 # turn on the legend
    39 plt.legend()
    40 plt.show()

     一般来说,直方图的外廓曲线接近于总体X的概率密度曲线。

     2.舍选抽样法(Rejection Methold)

    用反变换法生成随机数时,如果求不出F-1(x)的解析形式或者F(x)就没有解析形式,则可以用F-1(x)的近似公式代替。但是由于反函数计算量较大,有时也是很不适宜的。另一种方法是由Von Neumann提出的舍选抽样法。下图中曲线w(x)为概率密度函数,按该密度函数产生随机数的方法如下:

    基本的rejection methold步骤如下:

    1. Draw x uniformly from [xmin  xmax]

    2. Draw x uniformly from [0, ymax]

    3. if y < w(x),accept the sample, otherwise reject it

    4. repeat

    即落在曲线w(x)和X轴所围成区域内的点接受,落在该区域外的点舍弃。

    例子:下面的代码使用basic rejection sampling methold在区间[0, 10]上生成随机数,其概率密度近似为P(x)=e-x  

     1 # -*- coding: utf-8 -*-
     2 '''
     3 The following code produces samples that follow the distribution P(x)=e^−x  
     4 for x=[0, 10] and generates a histogram of the sampled distribution.
     5 '''
     6 import numpy as np
     7 import matplotlib.pyplot as plt
     8 
     9 
    10 P = lambda x: np.exp(-x)
    11 
    12 # domain limits
    13 xmin = 0  # the lower limit of our domain
    14 xmax = 10 # the upper limit of our domain
    15 
    16 # range limit (supremum) for y
    17 ymax = 1
    18 
    19 N = 10000    # the total of samples we wish to generate
    20 accepted = 0 # the number of accepted samples
    21 samples = np.zeros(N)
    22 count = 0    # the total count of proposals
    23 
    24 # generation loop
    25 while (accepted < N):
    26     
    27     # pick a uniform number on [xmin, xmax) (e.g. 0...10)
    28     x = np.random.uniform(xmin, xmax)
    29     
    30     # pick a uniform number on [0, ymax)
    31     y = np.random.uniform(0,ymax)
    32     
    33     # Do the accept/reject comparison
    34     if y < P(x):
    35         samples[accepted] = x
    36         accepted += 1
    37     
    38     count +=1
    39     
    40 print count, accepted
    41 
    42 # get the histogram info
    43 # If bins is an int, it defines the number of equal-width bins in the given range 
    44 (n, bins)= np.histogram(samples, bins=30) # Returns: n-The values of the histogram,n是直方图中柱子的高度
    45 
    46 # plot the histogram
    47 plt.hist(samples,bins=30,label=u'Samples')   # bins=30即直方图中有30根柱子
    48 
    49 # plot our (normalized) function
    50 xvals=np.linspace(xmin, xmax, 1000)
    51 plt.plot(xvals, n[0]*P(xvals), 'r', label=u'P(x)')
    52 
    53 # turn on the legend
    54 plt.legend()
    55 plt.show()

    >>> 

    99552 10000

    3.推广的舍取抽样法

    从上图中可以看出,基本的rejection methold法抽样效率很低,因为随机数x和y是在区间[xmin  xmax]和区间[0  ymax]上均匀分布的,产生的大部分点不会落在w(x)曲线之下(曲线e-x的形状一边高一边低,其曲线下的面积占矩形面积的比例很小,则舍选抽样效率很低)。为了改进简单舍选抽样法的效率,可以构造一个新的密度函数q(x)(called a proposal distribution from which we can readily draw samples),使它的形状接近p(x),并选择一个常数k使得kq(x)≥w(x)对于x定义域内的值都成立。对应下图,首先从分布q(z)中生成随机数z0,然后按均匀分布从区间[0   kq(z0)]生成一个随机数u0。 if u> p(z0) then the sample is rejected,otherwise uis retained.  即下图中灰色区域内的点都要舍弃。可见,由于随机点u0只出现在曲线kq(x)之下,且在q(x)较大处出现次数较多,从而大大提高了采样效率。显然q(x)形状越接近p(x),则采样效率越高。 

     

    根据上述思想,也可以表达采样规则如下:

    1. Draw x from your proposal distribution q(x)

    2. Draw y uniformly from [0  1]

    3. if y < p(x)/kq(x) , accept the sample, otherwise reject it

    4. repeat

    下面例子中选择函数p(x)=1/(x+1)作为proposal distribution,k=1。曲线1/(x+1)的形状与e-x相近。

     1 import numpy as np
     2 import matplotlib.pyplot as plt
     3 
     4 p = lambda x: np.exp(-x)         # our distribution
     5 g = lambda x: 1/(x+1)            # our proposal pdf (we're choosing k to be 1)
     6 CDFg = lambda x: np.log(x +1)    # generates our proposal using inverse sampling
     7 
     8 # domain limits
     9 xmin = 0  # the lower limit of our domain
    10 xmax = 10 # the upper limit of our domain
    11 
    12 # range limits for inverse sampling
    13 umin = CDFg(xmin)
    14 umax = CDFg(xmax)
    15 
    16 N = 10000 # the total of samples we wish to generate
    17 accepted = 0 # the number of accepted samples
    18 samples = np.zeros(N)
    19 count = 0 # the total count of proposals
    20 
    21 # generation loop
    22 while (accepted < N):
    23     
    24     # Sample from g using inverse sampling
    25     u = np.random.uniform(umin, umax)
    26     xproposal = np.exp(u) - 1
    27 
    28     # pick a uniform number on [0, 1)
    29     y = np.random.uniform(0, 1)
    30     
    31     # Do the accept/reject comparison
    32     if y < p(xproposal)/g(xproposal):
    33         samples[accepted] = xproposal
    34         accepted += 1
    35     
    36     count +=1
    37     
    38 print count, accepted
    39 
    40 # get the histogram info
    41 hinfo = np.histogram(samples,50)
    42 
    43 # plot the histogram
    44 plt.hist(samples,bins=50, label=u'Samples');
    45 
    46 # plot our (normalized) function
    47 xvals=np.linspace(xmin, xmax, 1000)
    48 plt.plot(xvals, hinfo[0][0]*p(xvals), 'r', label=u'p(x)')
    49 
    50 # turn on the legend
    51 plt.legend()
    52 plt.show()

    >>> 

    24051 10000

    可以对比基本的舍取法和改进的舍取法的结果,前者产生符合要求分布的10000个随机数运算了99552步,后者运算了24051步,可以看到效率明显提高。

     

    参考:

    http://iacs-courses.seas.harvard.edu/courses/am207/blog/lecture-3.html

    http://blog.csdn.net/xianlingmao/article/details/7768833

    http://blog.sina.com.cn/s/blog_60b44d6a0101l45z.html

    http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html

    展开全文
  • RANDOM(D) 在域 D 上生成一个随机数,其中 D 是定义 N 个不相交区间 (Nx2)-实矩阵。 RANDOM(D, N) 是具有随机项 N×N 矩阵,从 D 定义的域上的均匀分布中选择。 RANDOM(D,M,N) 和 RANDOM(D, [M,N]) 是 M×N ...
  • pythonCSS布局HTML小编今天和大家分享正态分布的随机数Python编程产生非均匀随机数的几种方法代码如果函数y=f(x)是定义域D上的单调函数,那么f(x)一定有反函数存在,且反函数一定是单调的。分布函数F(x)为是一个单调...

    pythonCSS布局HTML小编今天和大家分享正态分布的随机数

    Python编程产生非均匀随机数的几种方法代码

    如果函数y=f(x)是定义域D上的单调函数,那么f(x)一定有反函数存在,且反函数一定是单调的。分布函数F(x)为是一个单调递增函数,所以其反函数存在。从直观意义上理解,因为r一一对应着x,而在[0,1]均匀分布随机数R≤r的概率P(R≤r)=r。

    a0041628912c67353b73e9ceaf170cfb.png

    Python如何生成服从某个概率分布的随机数

    也可直接点“搜索资料”搜索整个问题。 概率分布 随机数 python 服从 搜索资料 本地图片 图片链接 代码 提交回答 匿名 回答自动保存中

    python中用random.sample()生成的一组随机数,怎么例如 a=random.sample([1,2,3,4,5,6,7],3) 输入什么代码能让a从小到大排保存到列表里面。

    python如何一次性取出多个随机数

    关于Python中的随机数生成步骤和随机数质量

    CSS布局HTML小编今天和大家分享大神讲解写Python2.7里面random随机数生成模块中随机数生成的详细步骤Python生成随机数和随机数质量的方法,random.random()用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成随机数: print random.uniform(10, 20) print random.uniform(20, 10) # #18.7356606526

    如何用python编写一个产生1~100的随机数程序

    需要用到random模块 import random n = random.randint(1,10) 会生成一个1到10的随机整数。 插入列表即可 [].append(n)

    今天的python培训作业,CSS布局HTML小编今天和大家分享帮助,最好详细一点~

    random模块 随机整数:random.randint(a,b):返回随机整数x,a

    如何用python生成两组随机数〈各50个,范围1

    展开全文
  • RANDPDF 从 p 和 px 中定义的... dim 定义输出矩阵维度,例如 dim=[100 3] 定义具有 300 个随机数的 100x3 二维矩阵。 记住:这不是一个真正的随机数生成器,而只是将均匀分布的伪随机数转换为所需的 pdf 的某种转换!
  • 在内部生成随机数一个超形状取决于一些用户定义的参数值,必须简单地调整。 为了模拟这个想法MATLAB,我们受到参考文献[1]启发其重要战略就是“极地协调” 参考[1] Xiao, Xin., Li T. and Zhang, R., 2015. 基于...
  • C++使用STL产生服从均匀分布的随机数代码 代码 // 包含random头文件 #include<random> #include<iostream> int main() { //定义均匀分布对象,均匀分布区间(a,b)为(-10,-10) std::uniform_int_...

    C++使用STL产生服从均匀分布的随机数

    代码

    // 包含random头文件
    #include<random>
    #include<iostream>
    int main() {
    	//定义均匀分布对象,均匀分布区间(a,b)为(-10,10)
    	std::uniform_int_distribution<int> uid{ -10,10 };
    	//均匀分布区间(a,b)
    	std::cout << uid.a() <<" "<< uid.b() << std::endl;
    	//定义随机数种子
    	std::random_device rd;
    	//定义默认随机数生成器
    	std::default_random_engine dre{ rd() };
    	std::cout << "五个随机数如下" << std::endl;
    	for (int i = 0; i < 5; ++i)
    		std::cout << uid(dre) << std::endl;
    	return 0;
    
    }
    
    展开全文
  • 随机数的产生

    2012-05-27 17:30:20
    方法:头文件中rand()函数可以产生一个闭区间[0,RAND_MAX] 的均匀随机数,其中RAND_MAX在中被定义为常数32767,严格地说,这里随机数是“伪随机数”,因为它是由数学公式计算出来,不过在算法领域,多数情况下...
    方法:头文件<stdlib.h>中的rand()函数可以产生一个闭区间[0,RAND_MAX] 的均匀随机数,其中RAND_MAX在<stdlib.h>中被定义为常数32767,严格地说,这里的随机数是“伪随机数”,因为它是由数学公式计算出来的,不过在算法领域,多数情况下可以吧她当作真正地随机数。
    示例:

    产生n个区间[1,m]上的随机数。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main()
    {
    	int i,n,m,random;
    	scanf("%d%d",&n,&m);
    	srand(time(NULL));    //初始化随机种子
    	printf("%d\n",RAND_MAX);
    	for(i=1;i<=n;i++)
    	{
    	    random=( (double)rand()/RAND_MAX ) * m +1;  //先用((double)rand()/RAND_MAX ))产生[0,1]之间的随机数,然后扩大m倍加1就是[1,m]区间的随机数
    	    printf("%d ",random);
    	}
    	
    	return 0;
    }

    程序中函数srand(unsigned seed)用来初始化随机种子,当种子seed 相同时,计算出来的“随机数”序列总是相同的。程序中用time(NULL)作为种子,就可以使srand()每次用不同的种子来初始化。具体程序中要根据程序需求恰当选取种子。

    展开全文
  • C++ 随机数

    2021-01-17 17:51:32
    rand函数存在一些问题,比如不同范围的随机数、随机浮点数、非均匀分布数等。 随机数定义在头文件<random>中的随机数库通过随机数引擎类(random-number engines) 和 随机数分布类(random-number
  • C++关于随机数的笔记

    2020-06-09 14:56:01
    在C++中生成随机数的方法主要包括std::rand方法以及random库方法(C++11)。 std::rand 方法 std::rand方法定义在cstdlib(stdlib.h)中,其作用是产生一个0到RAND_MAX之间的整数。其中RAND_MAX是cstdlib中定义的一个宏...
  • 一、生成均匀分布的随机数 1. rand 生成的随机数在0到RAND_MAX(2147483647)之间,在stdlib中定义,使用 % 结合 / 可生成某个范围内的随机数,但是这里生成的随机数是唯一确定。 #include <iostream> ...
  • c的随机数

    2009-06-07 17:14:00
    各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算一组数值,当序列足够长,这组数值近 似满足均匀分布。c标准函数库提供一随机数生成器rand(定义在stdlib.h),能返回0-RAND_MAX...
  • MATLAB 随机数

    千次阅读 2018-07-26 10:18:46
    1、均匀分布的随机数(rand) 2、均匀分布伪随机整数(randi) 3、控制随机数生成(rng) 欢迎使用Markdown编辑器写博客 快捷键 Markdown及扩展 表格 定义列表 代码块 脚注 目录 数学公式 UML 图: 离线写...
  • 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取一组随机数。张量形状由参数sizes定义。 参数: sizes (int…) – 整数序列,定义了输出张量形状 out (Tensor, optinal) – 结果张量 torch.rand(2, 3) [[0...
  • numpy随机数的产生

    2020-03-13 22:40:37
    numpy.random.uniform均匀分布 ...功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high. 参数介绍: low: 采样下界,float类型,默认值为0; high: 采样上界,float类型,默认值...
  • C++随机数

    2019-10-05 18:50:56
    标准库还定义了一组分布模板,根据不同概率分布生成随机数。引擎和分布类型名字都与它们数学性质相对应。 随机数分布 均匀分布 uniform_int_distribution< IntT > u(m, n); uniform_real_distribution&...
  • 在python的scipy库中的ststs模块中有没有给定一个自定义的概率密度函数&#...然后产生对应分布的随机数的函数?这个自定义概率密度函数不包括内置的均匀分布,正态分布啥的,是自己任意定义的。</p>
  • 根据一般定义随机数应该具有以下三个性质:随机性,不存在统计学偏差,是完全杂乱数列,即分布均匀性和独立性;不可预测性,不能从过去的随机数数列推测出下一个出现数;不可重现性,不能重现相同数列。 ...
  • 随机数练习

    2020-11-24 09:41:08
    题目描述 构造一个大小为 100(共 100 个数)的随机 0、1 序列,也就是一个只含 0、1 的数组,要求 0 出现的概率为 1/3,1 ...# 定义均匀分布中获取随机数的函数 def get_uniform_random_number(low, high): """ :p
  • C++中的随机数函数

    千次阅读 2010-01-06 09:44:00
    C++中的随机数函数C++用的是rand()这个函数是用来产生随机数的,范围从0到RAND_MAX, 在中有这样一个定义: #define RAND_MAX 0x7fff //就是32767了 如果需要产生n到m范围内的随机整数,可以: int ans=rand()*(m-n)/...
  • 在计算机内,产生均匀分布随机数的方法简单,线性同余。 高斯分布,T分布,Gamma分布等分布类型的随机数可以通过均匀分布随机数来变换得到。 复杂的,或者自己定义的概率分布的随机数可以通过MCMC采样方法得到。它是...
  • pytorch生成随机数Tensor方法汇总

    千次阅读 2018-09-10 15:34:13
    开始学习pytorch 看到rand randn 函数感觉奇怪 所以找了下面文章区分   ...返回一个张量,包含了从区间[0, 1)的均匀分布中抽取一组随机数。张量形状由参数sizes定义。 参数: sizes (in...
  • C++11STL提供了很多分布类型,我比较常用均匀分布,均匀分布值有两种类型,一类是整数,另一类是浮点数,STL根据值类型定义了两个函数 std::uniform_int_distribution 和 std::uniform_real_distribution ...
  • C++11随机数简介

    2019-12-14 19:53:31
    C++11之前随机数都是使用C函数库rand来生成,此函数生成均匀分布伪随机数(0~32767);C++11中对随机数生成进行增强。 随机数简介 C++11在<random>中定义了一组类用于实现随机数随机数引擎类:生成...
  • 随机数发生器

    2020-03-29 19:19:57
    随机数发生器 在测试代码过程中,有时需要用到随机数。在C语言中,主要使用rand()函数和srand()...可以产生闭区间[0,RAND_MAX]之间的均匀随机整数。RAND_MAX至少为32767。 (3)RAND_MAX RAND_MAX以宏#define...
  • 首先说明下,这篇blog说是怎么利用rand()(C++)或者Math.random()(Java)等,已有[0,1]之间均匀分布的随机数发 生器,来实现指定概率分布(比如正太分布,几何分布或者指数分布)的随机数发生器。本blog以正太分布...
  • 在C++11标准之前,一般是利用rand()函数产生一个均匀分布,范围从0到系统相关最大值之间随机整数,然后再通过转换得到不同分布的随机数,这种方法比较麻烦,同时转换过程中会引入非随机性。 C++11标准中,...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 128
精华内容 51
关键字:

均匀随机数的定义