为了账号安全,请及时绑定邮箱和手机立即绑定

Python - 获取随机颜色,尽可能快地给出种子数

Python - 获取随机颜色,尽可能快地给出种子数

富国沪深 2021-06-30 13:01:09
我需要找到一个随机颜色,给定一个特定的种子号 - 快。两次给出相同的 ID,应该返回相同的颜色。我这样做了:def id_to_random_color(number):    random_bytes = hashlib.sha1(bytes(number)).digest()    return [int(random_bytes[-1]) / 255, int(random_bytes[-2]) / 255, int(random_bytes[-3]) / 255, 1.0]问题是多次计算数字的 sha1 总的来说非常慢。(我使用这个功能大约 10 万次)编辑:我使用散列函数的原因是我希望对于接近的数字使用不同的颜色例如id_to_random_color(7)应该与id_to_random_color(9)
查看完整描述

3 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

使用带有某种静态变量的简单随机数生成器可以提高性能:


import random

prev, r, g, b = None, 0, 0, 0

def id_to_random_color(number):

    global prev, r, g, b

    if number != prev:

        r = random.random()

        g = random.random()

        b = random.random()

        prev = number

    return r, g, b, 1.0

更新:

正如 AndrewMcDowell 在他的评论中所述,如果输入在非连续情况下重复,则该函数可能返回不同的值。

这是一个可能的解决方法:


import random

memory = {}

def id_to_random_color(number, memory):

    if not number in memory:

        r = random.random()

        g = random.random()

        b = random.random()

        memory[number] = (r, g, b, 1.0)

    return memory[number]

进一步更新:

甚至可以使用相同的函数框架来计算哈希:


memory = {}

def id_to_random_color(number):

    if not number in memory:

        numByte = str.encode(number)

        hashObj = hashlib.sha1(numByte).digest()

        r, g, b = hashObj[-1] / 255.0, hashObj[-2] / 255.0, hashObj[-3] / 255.0

        memory[number]= (r, g, b, 1.0)

        return r, g, b, 1.0

    else:

        return memory[number]

尽管它的语法有点冗长,但该else语句提高了一点性能,避免了后续的内存写入和读取(如 Jake 在他的回答中所述)。


查看完整回答
反对 回复 2021-07-13
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我会使用字典来快速索引已经生成的种子。


import random


random_seeds = {}


def id_to_random_color(number):

    if number in random_seeds.keys():

        return random_seeds[number]

    else:

        color = [random.random(), random.random(), random.random(), 1.0]

        random_seeds[number] = color

        return color


查看完整回答
反对 回复 2021-07-13
  • 3 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信