Python 3.9中不借助任何模块从列表获取随机元素的方法
不使用任何模块实现列表随机元素选择
嘿,这个需求很务实——有时候确实需要脱离依赖实现基础的随机逻辑,下面我给你两种可行的方案,都是纯Python代码,不需要导入任何模块:
方案一:基于线性同余生成器(LCG)的伪随机选择
线性同余生成器是很多编程语言内置随机数函数的底层实现,它通过数学公式生成伪随机序列,完全可以手动实现:
def simple_random(seed=None): # 采用glibc使用的LCG参数,平衡性和随机性表现不错 multiplier = 1103515245 increment = 12345 modulus = 2 ** 31 # 用新创建对象的ID作为默认种子,每次运行都会有不同的初始值 current = seed if seed is not None else id(object()) while True: current = (multiplier * current + increment) % modulus # 将生成的数归一化到0-1之间的浮点数 yield current / modulus def my_choice(lst): if not lst: raise ValueError("Cannot choose from an empty list!") # 初始化随机数生成器 rng = simple_random() # 生成0到列表长度-1之间的索引 random_index = int(next(rng) * len(lst)) return lst[random_index] # 测试你的列表 list1 = ['a', 'b', 'c', 'd'] print(my_choice(list1))
原理说明:
simple_random函数实现了LCG的核心逻辑,通过循环生成伪随机数;- 用
id(object())作为默认种子是因为每次创建新对象都会得到唯一的ID,能保证每次运行的初始值不同; - 最后将生成的0-1之间的数乘以列表长度取整,得到合法的索引,从而随机选取元素。
方案二:基于哈希值的简易随机选择
如果不需要太复杂的随机逻辑,也可以利用Python内置的hash()函数来实现,代码更简洁:
def simple_choice(lst): if not lst: raise ValueError("Cannot choose from an empty list!") # 用新对象的ID生成哈希值作为随机种子 random_seed = hash(str(id(object()))) # 取绝对值后对列表长度取模,得到合法索引 random_index = abs(random_seed) % len(lst) return lst[random_index] # 测试 list1 = ['a', 'b', 'c', 'd'] print(simple_choice(list1))
原理说明:
id(object())生成唯一的对象标识,转成字符串后哈希,得到一个整数;- 对哈希值取绝对值再取模,确保索引在列表的合法范围内;
- 这种方法的随机性不如LCG,但胜在代码简洁,适合简单场景。
需要注意的是,这两种方法都是伪随机的(没有依赖硬件随机源),但完全满足不使用任何模块的需求,在大多数常规场景下表现足够好。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

