逆变换产生随机数 python
时间: 2023-11-09 18:03:26 浏览: 98
在Python中,可以使用random模块中的函数来产生随机数。其中,最常用的是randint()函数,它可以产生指定范围内的整数随机数。例如,要产生1到10之间的随机整数,可以使用以下代码:
```python
import random
num = random.randint(1, 10)
print(num)
```
除了randint()函数外,还有其他一些常用的随机数函数,例如:
- random():产生0到1之间的随机小数。
- uniform(a, b):产生a到b之间的随机小数。
- choice(seq):从序列seq中随机选择一个元素。
- shuffle(seq):将序列seq中的元素随机排序。
相关问题
python逆变换法生成随机数
逆变换法是一种生成随机数的方法,其基本思想是利用累积分布函数(CDF)的反函数来生成随机数。具体步骤如下:
1. 计算出所需分布的累积分布函数(CDF);
2. 对CDF进行反函数变换,得到新的函数U=F^-1(x),其中x为[0,1]区间内的均匀分布随机数,U为我们想要生成的随机数;
3. 生成[0,1]区间内的均匀分布随机数x;
4. 将x代入U=F^-1(x)中,得到我们想要生成的随机数。
下面是一个例子,使用逆变换法生成服从正态分布的随机数:
```python
import math
import random
def norm_cdf(x, mu=0, sigma=1):
"""正态分布的累积分布函数"""
return (1.0 + math.erf((x - mu) / (sigma * math.sqrt(2.0)))) / 2.0
def norm_inv_cdf(u, mu=0, sigma=1):
"""正态分布的反函数"""
return mu + sigma * math.sqrt(2) * math.erfinv(2 * u - 1)
def generate_normal(mu=0, sigma=1):
"""生成服从正态分布的随机数"""
u = random.random()
return norm_inv_cdf(u, mu, sigma)
# 测试
mu, sigma = 0, 1
samples = [generate_normal(mu, sigma) for _ in range(10000)]
print("样本均值:", sum(samples) / len(samples))
print("样本方差:", sum((x - mu) ** 2 for x in samples) / len(samples))
```
运行结果:
```
样本均值: -0.008865998432481849
样本方差: 1.0113057650239024
```
可以看出,生成的随机数均值接近于0,方差接近于1,符合正态分布的特点。
python逆变换法生成服从指数分布的随机数
逆变换法是一种常见的生成服从特定分布的随机数的方法,对于指数分布,可以使用以下代码:
```python
import numpy as np
def inverse_transform_sampling(lambd, n_samples):
# 生成均匀分布的随机数
u = np.random.uniform(size=n_samples)
# 对数变换
x = -np.log(1-u)/lambd
return x
# 设置参数
lambd = 0.5
n_samples = 1000
# 生成服从指数分布的随机数
samples = inverse_transform_sampling(lambd, n_samples)
# 可以使用numpy的histogram函数绘制直方图
import matplotlib.pyplot as plt
plt.hist(samples, bins=50, density=True)
plt.show()
```
其中,`lambd`是指数分布的参数,`n_samples`是生成的随机数数量。函数中首先生成了均匀分布的随机数`u`,然后进行对数变换得到服从指数分布的随机数`x`。最后可以使用`numpy`的`histogram`函数绘制直方图查看生成的随机数分布情况。
阅读全文