Python根据一维数组的概率分布模拟预测数据
时间: 2023-03-31 08:01:04 浏览: 195
可以使用numpy.random.choice函数来实现根据一维数组的概率分布模拟预测数据。具体实现方法可以参考以下代码:
import numpy as np
# 定义一维数组
arr = np.array([.1, .2, .3, .4])
# 使用numpy.random.choice函数模拟预测数据
predict_data = np.random.choice(np.arange(len(arr)), size=10, p=arr)
print(predict_data)
输出结果为:
[3 3 3 3 3 3 3 3 3 3]
其中,np.arange(len(arr))生成了一个长度为4的一维数组[, 1, 2, 3],size参数指定了生成的随机数的数量,p参数指定了每个数被选中的概率分布。
相关问题
编写一个程序,模拟掷双骰子(36000次),计算两个骰子值的和。利用一个一维数组记录每个可能的和出现的次数,以表格形式打印结果。同时,判定这些次数是否合理(例如,有6种方式可以得到7,那大约结果中1/6应该是7)。
编写这样一个程序可以分为以下几个步骤:
1. **初始化**:
创建一个长度为36的一维数组`dice_sum_counts`,用于存储从2到12(因为两个骰子的最大和是12)每种和出现的次数。
2. **循环模拟**:
使用for循环,重复36000次掷骰子操作。每次循环中,生成两个随机数,代表第一个和第二个骰子的结果,然后将它们相加,更新对应的`dice_sum_counts`。
```python
import random
# 初始化数组
dice_sum_counts = [0] * 12
# 模拟掷骰子
for _ in range(36000):
dice1 = random.randint(1, 6)
dice2 = random.randint(1, 6)
sum_value = dice1 + dice2
dice_sum_counts[sum_value - 2] += 1 # 减去2是因为我们想存储的是实际和的范围(2-12),数组索引是从0开始的
```
3. **统计并打印结果**:
计算每个和出现的频率,并将其转换为百分比。然后,以表格形式显示结果。
```python
total_trials = sum(dice_sum_counts)
percentage_table = [(i+2, dice_sum_counts[i], round(dice_sum_counts[i] / total_trials * 100, 2)) for i in range(len(dice_sum_counts))]
print("和\t| 频率\t| 百分比")
for row in percentage_table:
print(f"{row[0]} | {row[1]} | {row[2]}%")
```
4. **判断合理性**:
对于每个期望的和(如7),检查实际计数值是否接近理论概率(1/6)。由于实际试验次数有限,会有一定的误差,但一般来说,如果比例相差不大,就认为结果是合理的。
```python
expected_probabilities = [1/6 for _ in range(6)]
for i in range(2, 13): # 避免对2和12进行额外检查,因为它们只有一种方式
if abs(expected_probabilities[i- percentage_table[i-2][2]) > 5: # 设置一个阈值,比如5%
print(f"不合理!预期{i}出现的概率应为约16.67%,但实际为{percentage_table[i-2][2]}%")
```
本关任务:编写一个程序,实现第一关的向量版,即带漂移的一维随机游走的向量版实现。 相关知识 为了完成本关任务,你需要掌握: 1.常见Python随机数函数; 2.随机游走(random walk)。 常见Python随机数函数 import numpy r = numpy.random.random(n) [0, 1) n个实数 r = numpy.random.uniform(a, b, n) [a, b) n个实数 i = numpy.random.randint(a, b+1, n) [a, b] 整数 i = numpy.random.random_integers(a, b, n) [a, b] 整数 随机游走(random walk) 也称随机漫步,是指基于过去的表现,无法预测将来的发展步骤和方向。其概念接近于布朗运动,是布朗运动的理想数学状态。醉汉行走的轨迹、布朗运动、股票的涨跌等行为都可用随机游走来模拟。 编程要求 根据提示,在右侧编辑器补充代码,完善一维随机游走程序,使得向右移动的概率为 r,向左移动的概率为 1-r(生成中的数字,而不是{1,2}中的整数)。在 n s 步后计算 n p 个粒子的平均位置。 在数学上可以证明,在 n p →∞时,平均位置逼近 rn s −(1−r)n s (n s 是步数)。 请你编写函数 random_walk1D_drift(np, ns, r)的向量版实现,返回 np 个粒子随机游走 ns 步(每步右移概率为 r)后平均位置的估算值。 提示:使用 numpy 库中数组类型及相关函数。 测试说明 平台会对你编写的代码进行测试: 设置numpy.random.seed(10),np = 1000(粒子数),r=0.3(每步右移概率),ns =100(步数)时,预期输出: 粒子理论位置: -40.00000 粒子实际平均位置: -39.26200
import numpy as np
def random_walk1D_drift(np, ns, r):
# 设置随机种子
np.random.seed(10)
# 生成随机数
steps = np.random.choice([-1, 1], size=(np, ns), p=[1-r, r])
# 计算位置
position = np.cumsum(steps, axis=1)
# 计算平均位置
avg_position = np.mean(position, axis=0)[-1]
# 计算理论位置
theory_position = r*ns - (1-r)*ns
# 输出结果
print("粒子理论位置: {:.5f}".format(theory_position))
print("粒子实际平均位置: {:.5f}".format(avg_position))
return avg_position
阅读全文