V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LeeReamond
V2EX  ›  程序员

请问有没有概率不均等的随机数生成算法?

  •  
  •   LeeReamond · 2022-12-07 20:40:53 +08:00 · 1308 次点击
    这是一个创建于 717 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在做相似商品推荐,给定用户的特征后后台会回一个向量串,里面分别是

    [
    A 对象和输入的相似度为 99.5%,
    B 对象相似度为 99.2%,
    C 对象相似度为 80%
    ] 
    

    等等等等以此类推 由于推荐列表很长,实际能展示的只有几个,如果只取相似度最高的几个的话还好,但如果想随机选几个的话,有一定随机性,有没有一种随机数可以让相似度高的更多被选中,相似度少的更少被选中?

    ===

    题外话,不是很严格的相似推荐,要求没有那么高,目前的系统满足需求挺好的,暂时不考虑从推荐系统方面整个改。。。

    9 条回复    2022-12-07 22:12:47 +08:00
    huangsijun17
        1
    huangsijun17  
       2022-12-07 20:46:09 +08:00
    加个总和,在综合内生成随机数。再按照发布来决定结果。
    sblid
        2
    sblid  
       2022-12-07 20:49:12 +08:00   ❤️ 1
    举个例子,a=3, b=2, c=1,
    先做归一化,a=1/2, b=1/3, c=1/6,
    使用 [0,1) 均匀分布抽样,k 属于[0, 1/2),选 a ; k 属于[1/2, 1/2+1/3), 选 b ; k 属于[1/2+1/3, 1),选 c 。
    LeeReamond
        3
    LeeReamond  
    OP
       2022-12-07 21:32:04 +08:00
    @sblid
    @huangsijun17 感觉需要进行一定的线性变换,毕竟按这个算法 100%关联度的也只比 10%关联度的容易出现 10 倍而已,而且如果列表比较长的话感觉这个计算挺耗时间的啊。。
    smdbh
        4
    smdbh  
       2022-12-07 21:36:36 +08:00
    正态分布,平均分布随机数 ,两个组合用,
    luckykong
        5
    luckykong  
       2022-12-07 21:42:58 +08:00
    一个客户应该不会高频查询的。
    服务器直接生成 10w 个不均等的抽样方法,每次随机选一个去跟全部相似商品列表匹配,然后再传出去喽
    menc
        6
    menc  
       2022-12-07 22:03:56 +08:00
    经典带权随机。
    线上最节省时间的解决方案:预生成大数组,infer 时 random integer ,以随机的整数为数组下标取数组值。

    如 a, b, c, d 四个样本权重为 [1, 2, 2, 3], 生成 size 为 8 的数组,内容为[a, b, b, c, c, d, d, d],然后 random int 即可。

    一般加一个 id -> int 的映射,实际申请空间是个 int 数组,使用下来并没有很消耗内存,很经济。
    Tanix2
        7
    Tanix2  
       2022-12-07 22:05:54 +08:00
    如果是 python ,直接用库函数

    import random

    items = ["apple", "banana", "orange", "strawberry"]

    weights = [0.995, 0.992, 0.8, 1]

    # Select a random item with weighted probabilities
    chosen_item = random.choices(items, weights)[0]

    print(chosen_item) # Prints one of the items from the list
    ccagml
        8
    ccagml  
       2022-12-07 22:08:12 +08:00 via Android
    按照一二楼的说法,如果你的列表是有序的,你可以 1-100 ,权重 1000000 ,101-999 ,权重 10000 ,1000-9999 权重 10 ,然后从( 1000000+10000+10 )中随机一个数出来,这个数就可以计算本次是选中哪一个
    ccagml
        9
    ccagml  
       2022-12-07 22:12:47 +08:00 via Android
    应该也可以避免 100%只比 10%多 10 倍,还有数组太长循环计算和的情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2709 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:23 · PVG 18:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.