不借助collections.shuffle()实现分难度随机无重复展示15道题目
不用collections.shuffle()实现分阶段随机无重复展示题目
没问题!咱们完全可以不靠collections.shuffle()来实现你的需求——核心思路是随机生成列表索引+移除已选中的元素,这样既能保证无重复,又能按你要的顺序(先简单、再中等、最后难题)来展示。
具体实现步骤
- 先把你的15道题按难度拆成三个独立列表:比如
easy_questions(至少5道)、medium_questions(至少5道)、hard_questions(至少5道) - 写一个通用的小函数,负责从指定列表里随机选出N道不重复的题目
- 按要求的顺序,先调用函数选5道简单题,展示完再选5道中等题,最后选5道难题
完整代码示例
假设你的题目数据是这样的(你可以直接替换成自己的实际题目内容):
# 示例题目集合,替换成你自己的题目即可 easy_questions = ["简单题1", "简单题2", "简单题3", "简单题4", "简单题5", "简单题6", "简单题7", "简单题8", "简单题9", "简单题10"] medium_questions = ["中等题1", "中等题2", "中等题3", "中等题4", "中等题5", "中等题6", "中等题7", "中等题8", "中等题9", "中等题10"] hard_questions = ["难题1", "难题2", "难题3", "难题4", "难题5", "难题6", "难题7", "难题8", "难题9", "难题10"]
然后是核心的选题函数和展示逻辑:
import random def pick_unique_random(question_list, num_to_pick): selected = [] # 复制原列表,避免修改原始题目数据 temp_list = question_list.copy() for _ in range(num_to_pick): # 生成当前剩余列表的合法随机索引 random_pos = random.randint(0, len(temp_list) - 1) # 取出题目并加入选中列表,同时从临时列表移除它(避免重复选) selected.append(temp_list.pop(random_pos)) return selected # 按要求顺序获取随机题目 selected_easy = pick_unique_random(easy_questions, 5) selected_medium = pick_unique_random(medium_questions, 5) selected_hard = pick_unique_random(hard_questions, 5) # 分阶段展示题目 print("=== 随机简单题 ===") for i, q in enumerate(selected_easy, 1): print(f"{i}. {q}") print("\n=== 随机中等题 ===") for i, q in enumerate(selected_medium, 1): print(f"{i}. {q}") print("\n=== 随机难题 ===") for i, q in enumerate(selected_hard, 1): print(f"{i}. {q}")
逻辑解释
- 用
temp_list = question_list.copy()复制原列表是为了保护你的原始题目数据,避免后续想再用的时候发现数据被改了 random.randint(0, len(temp_list)-1)会生成一个当前临时列表范围内的有效索引,绝对不会出现越界错误- 每次选完题目后用
pop()移除它,这样临时列表里剩下的都是未被选中的题目,完美保证无重复 - 分三次调用函数,严格按照先简单、再中等、最后难题的顺序展示,完全符合你的要求
这种方法逻辑直白,容易理解,完全不需要依赖collections.shuffle()就能实现你要的功能。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

