You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制无依赖随机采样器报错: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。

修复方案

  1. 修正时间获取代码:给perf_counter添加括号,执行函数获取当前时间的浮点值:
t = time.perf_counter()
  1. 修复列表取值错误:pseudo_uniform返回的是列表类型,直接int(s)会报错,需要取列表第一个元素:
idx = int(s[0])
  1. 补充导入依赖:确保代码开头导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:15:30