有什么简单的算法能够从一个 2 万左右的数字算出 3 个 0-255 的数字呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Lothar
V2EX    程序员

有什么简单的算法能够从一个 2 万左右的数字算出 3 个 0-255 的数字呢

  •  
  •   Lothar
    misaka42 2017-09-27 15:38:57 +08:00 3226 次点击
    这是一个创建于 2948 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求助大家一个简单的算法

    具体需求

    一个 20000+ ~ 30000+ 的正整数,能否通过一个算法固定的映射到 0~255 的三个数字,而且足够离散(即随机程度比较高)。

    举例

    比如

    • 33180 -> rgb(0, 255, 0)
    • 25105 -> rgb(123, 46, 78)

    我的初步想法是能不能 n % 255, n * 3 % 255, n * 7 % 255 这样,不过这样似乎会导致 3 个数字之间有一定的关联,不够随机。不知道大家有没有什么好办法呢。

    14 条回复    2017-09-28 10:44:15 +08:00
    QAPTEAWH
        1
    QAPTEAWH  
       2017-09-27 15:45:27 +08:00
    相当于映射到 0~16777215 ?
    qq316107934
        2
    qq316107934  
       2017-09-27 15:47:56 +08:00
    CRC32(int) % 16777215 % 255 % 65535
    Valyrian
        3
    Valyrian  
       2017-09-27 15:49:35 +08:00
    何止是有一定关联, ((n%255)x3)%255 = 3n%255
    zj299792458
        4
    zj299792458  
       2017-09-27 15:50:31 +08:00
    把一个 3 万的集合映射到一个几千万的集合,好像不太够?
    flyingghost
        5
    flyingghost  
       2017-09-27 15:51:16 +08:00
    看起来不需要可逆?

    那就相当随意了。。。sum(md5(n)) % 255 反正足够随机+落到 0~255 范围内即可。
    luos543
        6
    luos543  
       2017-09-27 15:51:37 +08:00
    用这个正整数作为 seed 生成 3 个随机数(逃
    qq316107934
        7
    qq316107934  
       2017-09-27 15:53:05 +08:00
    @luos543 #6 不满足固定映射的条件,感觉还是要用哈希函数
    momocraft
        8
    momocraft  
       2017-09-27 15:53:28 +08:00
    密码学 hash 应该比简单 hash 更有利于离散,比如 md5() 后取末尾 24bit
    luos543
        9
    luos543  
       2017-09-27 15:54:09 +08:00
    @qq316107934 是固定映射,因为大部分随机库都是假随机。
    nousername2030
        10
    nousername2030  
       2017-09-27 15:55:40 +08:00
    @luos543 不同 seed 得到的序列混用是不符合随机特性的
    zhy0216
        11
    zhy0216  
       2017-09-27 16:05:13 +08:00
    sin(x) * 16777215 ?
    zhy0216
        12
    zhy0216  
       2017-09-27 16:06:39 +08:00
    ^^ 错了
    (sin(x) + 1) / 2 * 16777215
    af463419014
        13
    af463419014  
       2017-09-27 16:24:17 +08:00
    用现成的离散算法计算,然后再取模
    数字的 hash 连续的,那就 md5 一下
    hash(md5(x))%(256*256*256)
    vjnjc
        14
    vjnjc  
       2017-09-28 10:44:15 +08:00
    @QAPTEAWH 对啊,相当于 24bit.
    但小的数( 2w)怎么映射到大的数( 1677w )?
    简单乘以 900 ?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1073 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 17:57 PVG 01:57 LAX 10:57 JFK 13:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86