正态分布的峰度为 3。随着分布中异常值的增加,尾部变得“胖”,峰度增加到3以上。
如何在峰度大于3(最好在5-7左右)的两个数之间生成随机分布?
进口
import numpy as np
import scipy.stats import kurtosis
0.01-0.10之间的随机均匀性
# Random Uniform Distribution
runif = np.random.uniform(0.01, 0.10, 10000)
kurtosis(runif, fisher=False)
1.8124891901330156
0.01-0.10之间的随机正态分布
lower = 0.01
upper = 0.10
mu = (upper)/2
sigma = 0.01
N = 10000
retstats = scipy.stats.truncnorm.rvs((lower-mu)/sigma,(upper-mu)/sigma,loc=mu,scale=sigma,size=N)
mean = .05
stdev = .01 # 99.73% chance the sample will fall in your desired range
values = [gauss(mean, stdev) for _ in range(10000)]
kurtosis(values, fisher=False)
3.015004351756201
0.01-0.10之间的厚尾随机正态分布
???
由于峰度不是正态分布函数的参数之一,因此必须使用另一种方法来生成近似于正态分布的函数。它变得复杂。看看这个: https://stats.stackexchange.com/questions/43482/transformation-to-increase-kurtosis-and-skewness-of-normal-r-v
上面的链接给出了使用R(叹息)代码的示例,但我认为它足够简单,可以让你用Python编写等效的代码。这是我所知道的允许你实现这一目标的几个扩展(即函数分层)之一。
不幸的是,据我所知没有简单的解决方法。
正态分布的峰度始终为3。均匀分布的峰态为9/5。长尾分布的峰形高于3。例如,拉普拉斯分布的峰期为6。[注意,通常这些分布是根据超额峰态定义的,即实际峰态减去3。]见下表:http://mathworld.wolfram.com/KurtosisExcess.html
然而,通过切断尾巴,只能减少峰度。通过切割尾部,不可能生成峰度高于3的正态分布。为了生成范围有限且峰度高的分布,您需要确保切割对尾部的影响最小,并从长尾(非正态)分布开始。俗话说,你需要有一个非常尖锐的分布。我在下面用拉普拉斯和一个小指数衰减参数制作了一个。
import numpy as np
from scipy.stats import kurtosis
min_range = 0.01
max_range = 0.10
midpoint = (max_range + min_range)/2
samples = 10000
def filter_tails(x):
return x[(x >= min_range) & (x <= max_range)]
runif = np.random.uniform(min_range, max_range, samples)
value = kurtosis(filter_tails(runif), fisher=False)
print(f"uniform kurtosis = {value}")
sigma = 0.01
runif = np.random.normal(midpoint, sigma, samples)
value = kurtosis(filter_tails(runif), fisher=False)
print(f"gaussian kurtosis = {value}")
exponential_decay = 0.001
runif = np.random.laplace(midpoint, exponential_decay, samples)
value = kurtosis(filter_tails(runif), fisher=False)
print(f"laplace kurtosis = {value}")
运行脚本,我得到:
uniform kurtosis = 1.8011863970680828
gaussian kurtosis = 3.0335178694177785
laplace kurtosis = 5.76290423111418
我将需要初始化一个'n'数量的类,将有一个随机值附加到他们从1到100。 我知道如何创建一个介于1和100之间的随机值,但我如何使所有的值都落在一个正态分布模式?
问题内容: 如何在或中按照正态分布轻松生成随机数? 我不想使用Boost。 我知道Knuth详细讨论了这个问题,但是我现在没有他的书。 问题答案: 有许多方法可以从常规RNG生成高斯分布数。 该箱穆勒变换是常用的。它会正确产生具有正态分布的值。数学很简单。您生成两个(均匀)随机数,然后对它们应用公式,就得到两个正态分布的随机数。返回一个,并将另一个保存为下一个随机数请求。
问题内容: 我正在阅读Math.random()javadoc,发现random只是psuedorandom。 是否有一个库(特别是java)根据随机变量(例如环境温度,CPU温度/电压等)生成随机数? 问题答案: 查看http://random.org/ RANDOM.ORG是一种真正的随机数服务,可通过大气噪声生成随机性。 可以在以下位置找到用于与其连接的Java库: http //sou
问题内容: 最重要的答案是建议使用switch语句来完成这项工作。但是,如果我要考虑的情况很多,那么代码看起来就很笨拙。我有一个巨大的switch语句,在每种情况下都一遍又一遍地重复非常相似的代码。 当您要考虑的概率很大时,是否有更好,更干净的方法来选择具有一定概率的随机数?(例如〜30) 问题答案: 这是一个Swift实现,受各种答案的影响很大,这些答案会生成具有给定(数字)分布的随机数 对于
问题内容: 我们如何在Java中生成非常大的随机数?我说的是10000位数吗?我知道我们必须使用BigInteger,但是我们该怎么做呢?做这样的事情最有效的方法是什么?请提供一个小例子。谢谢。 问题答案: 嗯,一种方法是转到Random.org并下载二进制随机文件之一。这些文件是由大气噪声生成的,因此非常随机。我在国际象棋引擎中将其用于Zobrist键。 或者你可以去 这会给你你想要的。在此示例
本文向大家介绍基于JavaScript伪随机正态分布代码实例,包括了基于JavaScript伪随机正态分布代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了基于JavaScript伪随机正态分布代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在游戏开发中经常遇到随机奖励的情况,一般会采取先生成数组,再一个一个取的方式发随