自制无依赖随机采样器报错:int()参数类型不匹配问题排查
问题描述
尝试不使用numpy和random库,仅借助math库实现一个随机采样器,已编写伪随机数生成函数及randsamp采样函数,但运行时触发TypeError,错误提示为:
int() argument must be a string, a bytes-like object or a real number, not 'builtin_function_or_method'
问题出在代码行:seed = int(10**9*float(str(t-int(t))[0:])),需要排查问题原因。
相关代码
伪随机数生成函数
def fakenpzeros(size): rows, cols = 1, size matrix = [([0]*cols) for i in range(rows)] return matrix def pseudo_uniform(low = 0, high = 1, seed = 123456789, size = 1): # 生成指定区间内的均匀分布数值 return low + (high - low) * pseudo_uniform_good(seed = seed, size = size) def pseudo_uniform_bad(mult = 5, mod = 11, seed = 1, size = 1): U = fakenpzeros(size) x = (seed * mult + 1) % mod U[0] = x / mod for i in range(1, size): x = (x * mult + 1) % mod U[i] = x / mod return U def pseudo_uniform_good(mult = 16807, mod = (2 ** 31) - 1, seed = 123456789, size = 1): U = fakenpzeros(size) x = (seed * mult + 1) % mod U[0] = x / mod for i in range(1, size): x = (x * mult + 1) % mod U[i] = x / mod return U
随机采样函数
def randsamp(x): # 基于系统时钟小数部分设置种子,无需引入random库 t = time.perf_counter seed = int(10**9*float(str(t-int(t))[0:])) # 生成随机采样的索引 l = len(x) s = pseudo_uniform(low=0, high=l, seed=seed, size = 1) idx = int(s) return (x[idx])
问题排查与修复
核心错误原因
randsamp函数中t = time.perf_counter这行代码是致命问题:
time.perf_counter是一个函数对象,你没有加括号调用它,导致t存储的是函数本身,而非当前时间的浮点数值。- 后续执行
t-int(t)时,是在尝试对函数对象进行数学运算,这完全不符合类型要求,因此抛出了TypeError。
修复方案
- 修正时间获取代码:给
perf_counter添加括号,执行函数获取当前时间的浮点值:
t = time.perf_counter()
- 修复列表取值错误:
pseudo_uniform返回的是列表类型,直接int(s)会报错,需要取列表第一个元素:
idx = int(s[0])
- 补充导入依赖:确保代码开头导入
time库:
import time
修复后的完整randsamp函数
import time def randsamp(x): # 基于系统时钟小数部分设置种子,无需引入random库 t = time.perf_counter() # 优化:直接用t%1获取小数部分,避免字符串转换 seed = int(10**9 * (t % 1)) l = len(x) s = pseudo_uniform(low=0, high=l, seed=seed, size=1) idx = int(s[0]) return x[idx]
额外优化建议
获取时间小数部分可以直接用t % 1替代字符串转换,既简洁又避免了字符串操作带来的潜在问题,效率更高。
内容的提问来源于stack exchange,提问作者ThatDaven
相关产品推荐
相关产品推荐

