numpy生成随机数组,超几何分布与连续分布

有关随机数的函数可以在NumPy的random模块中找到

随机数发生器的核心算法是基于马特赛特旋转演算法

二项分布是n个独立重复的是/非试验中成功次数的离散概率分布. 抛硬币

Key_Function

np.random.binomial函数, 参数为区间, 概率, 次数, 用于模拟二项分布

Code

import numpy as np
import matplotlib.pyplot as plt

cash = np.zeros(10000)  # 生成10000个0的数组
cash[0] = 1000      # 数组的第一个元素设置为1000
outcome = np.random.binomial(9, 0.5, size=len(cash))
# 生成一个随机数组, 每次抛9个硬币, 每次正反面的几率为1/2, 数组长10000

for i in range(1, len(cash)):
    if outcome[i] < 5:
        cash[i] = cash[i - 1] - 1
    elif outcome[i] < 10:
        cash[i] = cash[i - 1] + 1
    else:
        raise AssertionError("Unexpected outcome" + outcome)
print(outcome.min(), outcome.max())

plt.plot(np.arange(len(cash)), cash)
plt.show

超几何分布

超几何分布, 描述的是一个罐子里有两种物件, 无放回地从中抽取指定数量的物件后, 抽出指定种类物件的数量.

Key_Function

np.random.hypergeometric函数, 模拟超几何分布

Code

‘‘‘
假设一个罐子有26个球, 25个普通球, 1个倒霉球
每次从中取3个, 取这3个的时候是不放回的
‘‘‘

import numpy as np
import matplotlib.pyplot as plt

points = np.zeros(100)
outcome = np.random.hypergeometric(25, 1, 3, size=len(points))
# 25个普通球, 1个倒霉球, 一次取3个(不放回), 一共取len(points)次
# 取到普通球得1分, 倒霉球得0分

for i in range(len(points)):
    if outcome[i] == 3:
        points[i] = points[i - 1] + 1
    elif outcome[i] == 2:
        points[i] = points[i - 1] - 6
    else:
        print(outcome[i])

plt.plot(np.arange(len(points)), points)
plt.show()

绘制正态分布

连续分布可以用PDF(概率密度函数)来描述

随机变量落在某一个区间内的概率等于概率密度函数在该区间下方的面积

Key_Function

np.random.normal函数, 得到均值为0, 方差为1的指定size的数组

Code

import numpy as np
import matplotlib.pyplot as plt

N = 10000
normal_values = np.random.normal(size=N)

dummy, bins, dummy = plt.hist(normal_values, np.sqrt(N), normed=True, lw=1)
# 指定y轴数据源, 指定显示的小长条个数
sigma = 1
mu = 0
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (bins - mu) ** 2 /
    (2 * sigma ** 2)), lw=2)
# 第一个参数是代表x轴的数组, 第二个参数是代表y轴的数组
# 本例中第二个参数是一个定义域为bins的映射
plt.show()

对数正态分布

对数正态分布是随机变量的自然对数,服从正态分布

Key_Function

np.random.lognormal函数, 模拟对数正态分布

Code

import numpy as np
import matplotlib.pyplot as plt

N = 10000
lognormal_values = np.random.lognormal(size=N)

dummy, bins, dummy = plt.hist(lognormal_values, np.sqrt(N), normed=True, lw=1)
sigma = 1
mu = 0
x = np.linspace(min(bins), max(bins), len(bins))
pdf = np.exp(-(np.log(x)-mu)**2/(2*sigma**2))/(x*sigma*np.sqrt(2*np.pi))
plt.plot(x, pdf, lw=3)
plt.show

对数正态分布的举例

有些量本身就是不对称的。例如,试想,人们完成某项特定任务需要的时间:因为每个人都是不同的,我们会得到一个分布。然而,所有的值都必然是正数(因为时间不可能为负数)。而且,我们还能预测到该分布可能的形状:有一个无人可及的最小时间,然后是少数一些非常快的“冠军”,接下来就是普通人的最具代表性的完成时间形成一个高峰,最后是尾部一长串的“掉队者”。显然,高斯分布不会很好地描述这样的分布,因为高斯分布中x可以定义为正值,也可定义为负值,它是对称的且尾部很短。

密度函数为:

原文地址:https://www.cnblogs.com/draven123/p/11415809.html

时间: 2024-08-06 00:14:05

numpy生成随机数组,超几何分布与连续分布的相关文章

numpy生成随机数组

python想要生成随机数的话用使用random库很方便,不过如果想生成随机数组的话,还是用numpy更好更强大一点. 生成长度为10,在[0,1)之间平均分布的随机数组: rarray=numpy.random.random(size=10) 或者 rarray=numpy.random.random((10,)) 生成在-0.1到0.1之间的平均分布: rarray=0.2*numpy.random.random(size=10)-0.1 或者 rarray=numpy.random.uni

生成随机数组

不多说,直接上代码测试,之前在网上看到一个生成随机数组,写的实在不怎么样,下面是我的方式,有谁有更好的方式,可以交流一下 C代码:很快很快的 #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { long last = 1000000; long *arr=(long *)malloc(last*sizeof(long)); long *brr=(long *)malloc(last

如何更高效率的生成随机数组

现在我们有一个需求:生成长度为100的随机数组(数值范围0~99),数值无重复. 通常方法: var _len = 100, _arrUsedFlag = [],_arrR=[]; for(var i=0;i<_len;i++){//初始化标志位数组,表示第N个数组是否已经被生成过 _arrUsedFlag.push(false); } i=0; for(;i<_len;i++){ var _isNewNum=false; //如果没有生成不重复的随机数,循环 while(_isNewNum=

numpy的随机数组

1.numpy.random.rand() 创建指定大小的随机数组,取值范围[0,1) import numpy as np # 创建2行2列取值范围为[0,1)的数组 arr = np.random.rand(2,2) 或 import numpy as np # 创建一维数组,元素个数为10,取值范围为[0,1) arr1 = np.random.rand(10) 2.numpy.random.randn() 创建指定大小的数组,取值范围为标准正态分布 # 创建2行3列,取值范围为标准正态分

如何从一个数组中生成随机数组

有一个需要,给定一个数组,从中生成要求个数的随机数组,不重复,即getRandomArray(int[] originalArray,int number) 这样的一个函数.想了一下,可以这样做: 把数组元素放到一个List中 从List中随机取一个数 把取到的数从List中删除 重复上述过程 代码如下: import java.util.ArrayList; import java.util.List; import java.util.Random; public class Test {

JavaScript 实现彩票中随机数组的获取

1.效果图: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Math.random方法彩票随机数的生成</title> </head> <body> <!-- 设置样式 --> <input type="text" id="text

随机生成一组不重复的随机数组

public string RadomNumArray() { Random r = new Random(); int a = 0; int[] num = new int[6]; string text = ""; for (int i = 0; i < 6; i++) {//循环生成6个数字 a = r.Next(0, 99);//随机生成0到99之间的数字 num[i] = a; for (int k = 0; k < num.Length; k++) {//遍历数

生成长度为n的int型随机数组,数组元素范围为0~n-1,每个元素都是唯一的。只使用基本数据类型。

import java.util.Arrays; import java.util.Comparator; import java.util.Random; import java.util.Scanner; /* 生成长度为n的int型随机数组,数组元素范围为0~n-1,每个元素都是唯一的.只使用基本数据类型. */ class Solution { public static void rand(int[] arr, int n) { for(int i = 0; i < n; i++) {

js随机生成一个数组中的随机字符串以及更新验证码

// 生成随机字符串function randomMixed(n) {    var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];    var res = "&qu