编辑代码

import random
import numpy as np

# 定义盲盒结果
results = ['A', 'B', 'C', 'D', 'E', 'F']

# 模拟一次购买盲盒
def simulate_purchase(num_boxes):
    # 随机许愿一种款式
    wish = random.choice(results)
    opened_boxes = []
    # 购买盲盒
    for _ in range(num_boxes):
        opened_boxes.append(random.choice(results))
    # 处理赠送盲盒
    while True:
        new_boxes = []
        # 规则一:许愿达成赠送盲盒
        wish_count = opened_boxes.count(wish)
        for _ in range(wish_count):
            new_boxes.append(random.choice(results))
        # 规则二:对对碰赠送盲盒
        non_wish_boxes = [box for box in opened_boxes if box != wish]
        for result in set(non_wish_boxes):
            if non_wish_boxes.count(result) >= 2:
                new_boxes.append(random.choice(results))
                # 移除已经对对碰的盒子
                for _ in range(2):
                    non_wish_boxes.remove(result)
        if not new_boxes:
            break
        opened_boxes.extend(new_boxes)
    return opened_boxes

# 模拟多次购买
def simulate_multiple_purchases(num_simulations, num_boxes):
    all_results = []
    for _ in range(num_simulations):
        result = simulate_purchase(num_boxes)
        all_results.append(len(result))
    return all_results

# 计算中位数
def calculate_median(results):
    return np.median(results)

# 模拟集齐6种结果的情况
def simulate_collect_all(num_simulations, num_boxes):
    success_count = 0
    total_cost = 0
    for _ in range(num_simulations):
        result = simulate_purchase(num_boxes)
        if set(result) == set(results):
            success_count += 1
        total_cost += num_boxes
    if success_count == 0:
        return float('inf')
    return total_cost / success_count

# 模拟次数
num_simulations = 10000

# 三种档位的盲盒数量
box_counts = [2, 4, 6]

# 计算每种档位最后能拿到的盲盒数量的中位数
medians = []
for num_boxes in box_counts:
    results = simulate_multiple_purchases(num_simulations, num_boxes)
    median = calculate_median(results)
    medians.append(median)

# 计算每种档位集齐6种结果的性价比
cost_per_success = []
for num_boxes in box_counts:
    cost = simulate_collect_all(num_simulations, num_boxes)
    cost_per_success.append(cost)

# 输出结果
print("三种价格档位最后能拿到的盲盒数量的中位数:")
print(f"档位一(25元购买2盒):{medians[0]}")
print(f"档位二(65元购买4盒):{medians[1]}")
print(f"档位三(95元购买6盒):{medians[2]}")

print("\n集齐6种结果每种至少一个时的性价比:")
print(f"档位一(25元购买2盒):{cost_per_success[0]}")
print(f"档位二(65元购买4盒):{cost_per_success[1]}")
print(f"档位三(95元购买6盒):{cost_per_success[2]}")

best_choice = np.argmin(cost_per_success) + 1
print(f"\n集齐6种结果每种至少一个时,档位 {best_choice} 性价比最高。")