如何执行多次random.choices测试并优化代码将结果写入CSV文件
解决方案
代码优化与功能实现步骤
一、优化原代码的内存占用
原代码创建包含10000个元素的marbles列表完全没必要——既然红蓝弹珠的概率都是50%,直接按概率随机生成样本就行,不用预存这么多元素,能省不少内存,尤其是做大量重复试验的时候。
二、实现A1.primo()函数
先明确函数逻辑:重复做抽样试验,每次抽一个k=4的小样本和k=7的大样本,统计小样本里目标事件的出现频率比大样本高的次数(或对应的概率)。这里默认以“红色弹珠出现频率”作为目标事件,你可以按需调整。
完整可运行代码
import random import csv # 生成指定大小的随机样本,无需预存全量弹珠 def generate_sample(sample_size): return [random.choice(["RED", "BLUE"]) for _ in range(sample_size)] # 计算样本中目标事件的频率 def get_frequency(sample, target="RED"): return sample.count(target) / len(sample) class A1: @staticmethod def primo(num_trials=1000): """ 统计小样本(k=4)频率高于大样本(k=7)的试验占比 :param num_trials: 总试验次数,默认1000次 :return: 符合条件的试验比例 """ success = 0 for _ in range(num_trials): small = generate_sample(4) large = generate_sample(7) if get_frequency(small) > get_frequency(large): success += 1 # 返回比例,也可以直接返回成功次数,看你需求 return success / num_trials # 执行测试并保存结果到CSV if __name__ == "__main__": # 执行试验,这里设10000次试验,结果更稳定 test_result = A1.primo(num_trials=10000) # 写入CSV文件 with open("marble_test_results.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 先写表头,再写结果 writer.writerow(["总试验次数", "小样本频率高于大样本的比例"]) writer.writerow([10000, round(test_result, 4)]) print(f"结果已保存到marble_test_results.csv,比例为{test_result:.4f}")
三、关键细节说明
- 内存优化:去掉了10000元素的列表,直接生成样本,内存占用从几MB降到几乎可以忽略,适合大规模试验。
- 函数灵活性:你可以修改
num_trials参数调整试验次数,次数越多结果越接近真实概率;如果要统计其他事件(比如蓝色频率、特定红蓝组合),改get_frequency或者判断条件就行。 - CSV保存:用Python内置的
csv模块,不用装额外依赖,生成的CSV可以直接用Excel或表格软件打开查看。
内容的提问来源于stack exchange,提问作者Astronaut
相关产品推荐
相关产品推荐

