点模拟器还是太麻烦,我自己写代码想直接算概率,但似乎涉及直线回复的方案跟砂井的数据对不上
import numpy as np
D=2500
def fixed(n_sample, activation_rate):
# 中盘定点回复
act = np.random.uniform(0, 1, n_sample)[np.newaxis, :] < activation_rate
return np.where(act, 0., 2.)
def midrace_random(n_sample, activation_rate):
# 中盘随机回复
act = np.random.uniform(0, 1, n_sample)[np.newaxis, :] < activation_rate
return np.random.uniform(0, 1, n_sample) + (1-act)*2
def straight_random(n_sample, activation_rate):
# 直线随机回复
act = np.random.uniform(0, 1, n_sample)[np.newaxis, :] < activation_rate
pos = np.random.uniform(0, 0.8032, n_sample)
pos = np.select([pos<0.3032, np.logical_and(pos>=0.3032, pos<0.5632), pos>=0.5632],
[pos+0.0632, pos+0.7664, pos+1.4264])
return pos + (1-act)*2
def sdm_skill_position_simulation(wit, n_sample, skill_comb):
# wit: 智力、n_sample: 随机模拟次数、skill_comb: 回复技能组合
wit = np.array(wit)[:,np.newaxis]
act_rate = 1-90/wit # 技能发动率
v_mid=0.991*(22-D/1000-0.00325+wit*np.log10(0.1*wit)/550000)+0.25 # 中盘速度
threshold = 1-(v_mid/100)#1-(v_mid*5*D/1000)/(D/2) 最早能存速的位置
position = np.ones((len(wit), n_sample, max(len(skill_comb),3)), dtype=np.float32) * 2.0 #回复技能发动位置
for i_skill in range(len(skill_comb)):
position[:, :, i_skill] = skill_comb[i_skill](n_sample, act_rate)
act_pos = np.sort(position, axis=2)[:,:,2] # sdm固有发动位置
r_pres_velo = np.mean(np.logical_and(act_pos > threshold, act_pos < 1), axis=1) #存速率
r_midrace = np.mean(act_pos < 1, axis=1) #中盘发动率
print(r_pres_velo, r_midrace)
sdm_skill_position_simulation([600,800,1000,1200], 1000, [midrace_random, midrace_random, midrace_random, straight_random])
sdm_skill_position_simulation([600,800,1000,1200], 1000, [midrace_random, midrace_random, straight_random, straight_random])
sdm_skill_position_simulation([600,800,1000,1200], 1000, [fixed, midrace_random, midrace_random, straight_random])
sdm_skill_position_simulation([600,800,1000,1200], 1000, [midrace_random, midrace_random, midrace_random])
2025年07月22日 21点07分
4